이 명령에 문제가 있나요?
$ trap 'killall $$ ; rm -f $folder2;exit ' 18 20 24
명령은 for
루프 에 있으며 for
실행하는 동안 누르면 프로세스를 중지 CTRL하고 자체적 으로 Z생성된 모든 파일(내부적으로)을 삭제하고 싶습니다 .folder2
folder2
하지만 터미널에서 -를 누르면 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의 답변trap
bash는 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는 실제로 예상대로 작동합니다.