'트랩'killall $$; rm -f $folder2;exit ' 18 20 24

'트랩'killall $$; rm -f $folder2;exit ' 18 20 24

이 명령에 문제가 있나요?

$ trap 'killall $$ ; rm -f $folder2;exit ' 18 20 24

명령은 for루프 에 있으며 for실행하는 동안 누르면 프로세스를 중지 CTRL하고 자체적 으로 Z생성된 모든 파일(내부적으로)을 삭제하고 싶습니다 .folder2folder2

하지만 터미널에서 -를 누르면 CTRL작동이 중지되지만 그 다음에는 다른 작업을 수행할 수 없으며 작동하지도 않습니다.ZCTRLC

답변1

문제는 현재 프로세스 PID를 제공하는 동안 killall해당 PID가 아닌 프로세스 이름과 일치하는 패턴이 필요하다는 것입니다. 대신 $$사용하고 싶습니다 kill.

또한 디렉터리와 해당 내용을 모두 삭제하려면 다음 -r으로 전환해야 합니다 rm.

마지막으로, 프로세스를 종료한 후에 수행하는 모든 작업은 적용되지 않습니다. kill끝 으로 이동하여 trap완전히 삭제합니다 exit.

trap 'rm -rf "$folder2";kill $$' 18 20 24

for삭제하기 전에 루프를 중지 하려면 $folder2다음을 사용할 수 있습니다 break.

trap 'break;rm -rf "$folder2";kill $$' 18 20 24

답변2

다음 스크립트를 예로 들어 보겠습니다.

#!/bin/bash

trap 'echo bye; kill $$' SIGTSTP
sleep 30

수면 중에 Control-Z를 눌렀다고 가정해 보겠습니다. 그러면 SIGTSTP가 sleep 및 bash를 포함하는 프로세스 그룹으로 전송됩니다. 설명된 대로Stack Overflow의 비슷한 질문에 대한 William Pursell의 답변trapbash는 run command()가 종료될 때까지 핸들러를 실행하지 않습니다 sleep. 그러나 sleep은 종료되지 않습니다. SIGTSTP도 수신했기 때문에 일시 중지됩니다. 이 시점에서는 중지되었기 때문에 control-C(SIGTERM), control-\(SIGQUIT) 등을 무시합니다. SIGKILL 외에는 실행을 중지할 수 없습니다.

따라서 trap실행되지 않습니다(계속해서 -9 sleep을 종료하지 않는 한 즉시 실행됩니다).

이 문제를 해결하려면 다음이 필요합니다.자식 프로세스를 무시하게 만들기아니면 SIGTSTP를 받지 않고 스스로 죽이는 일을 처리하세요. 또는 백그라운드에서 실행하세요 wait.

#!/bin/bash

trap 'echo bye; kill $$' SIGTSTP
sleep 30 &
wait

Control-Z는 실제로 예상대로 작동합니다.

관련 정보