Kill -9 백그라운드 작업도 bash를 죽입니다.

Kill -9 백그라운드 작업도 bash를 죽입니다.
sleep 1 & kill -9 $?

위의 내용은 죽일 것입니다 (대부분)세게 때리다쉘 또는 현재 터미널 창.

왜 그런 겁니까?


참고: sleep 1 & kill $?셸/터미널을 종료하지 않습니다.

내가 생각했던 것과 다른 것을 실행하지 않고 경쟁 조건 등이 있는지 확인하기 위해 다음과 같은 효과가 있습니다.

/bin/sleep 2 & pid=$?; sleep 1; kill -9 $pid

GNU bash, 버전 5.0.3(1) - 출시됨

답변1

$?마지막 명령의 종료 상태입니다. 백그라운드 명령 시작은 항상 성공하므로 에서 … & do_something_with $?값은 $?0입니다. 당신은 달리고 있습니다 kill -9 0.

전달된 PID는 kill기본 시스템 호출로 전달됩니다. Shell 매뉴얼에는 PID 이외의 다른 것이 될 수 있다고 문서화되어 있지 않지만시스템 호출 매뉴얼은. PID가 0이면 현재 프로세스의 모든 프로세스를 의미합니다.프로세스 그룹. (-1은 PID 1을 제외한 모든 프로세스를 의미하고 또 다른 음수 값은 지정된 프로세스 그룹의 모든 프로세스를 의미합니다.) 터미널에서 실행 중인 쉘은 자체 프로세스 그룹에 있습니다(많은 루프를 거치지 않거나 하위 쉘이 있는 경우 제외). 이는 백그라운드 작업에 있지 않음) 다음 kill -9 0과 동일합니다 kill -9 $$. 쉘 프로세스를 종료합니다.

모든 백그라운드 프로세스(예: sleep명령)는 계속 실행됩니다. 신호를 받지 못하고, 쉘은 신호를 보낼 기회조차 얻지 못합니다. 터미널이 죽어도 일반적으로 터미널에는 영향을 미치지 않습니다. 하지만 일부 프로그램은 닫힌 터미널에 쓰려고 하면 오류가 발생할 수 있습니다(물론 sleep작동하지 않습니다).

kill 0쉘에서 무시되는 TERM 신호를 보냅니다. kill -9 0무시할 수 없는 KILL 신호를 보냅니다.


가장 최근의 백그라운드 프로세스를 종료하고 싶다면 그게 전부입니다 $!.

관련 정보