첫째, 이것은 bash에만 국한되지 않습니다. ATT ksh, dash 및 zsh는 동일한 방식으로 작동합니다. 명령 행 편집 중에 SIGTERM 및 SIGQUIT를 무시합니다. mksh는 종료하지 않고 SIGINT처럼 취급합니다.
ksh 매뉴얼과 bash 매뉴얼은 다음과 같은 용어로 SIGTERM을 무시합니다.
그 때문에 kill 0
대화 형 쉘을 죽이지 않는다
kill 0
쉘이 있는 프로세스 그룹의 모든 프로세스를 중단시킵니다 ¹. 간단히 말해서 프로세스 그룹은 터미널의 포 그라운드에서 실행중인 모든 프로세스 또는 백그라운드 또는 일시 중단 된 작업의 모든 프로세스로 구성됩니다.
보다 정확하게는 이것이 작업 제어 기능이 있는 현대 쉘에서 발생하는 것 입니다. 이러한 셸에서는 kill 0
셸이 자체 프로세스 그룹에 있으므로 유용하지 않습니다. 이전 쉘 (또는 이후의 현대 쉘 set +m
)은 백그라운드 명령에 대한 프로세스 그룹을 작성하지 않았습니다. 따라서이 명령 kill 0
을 사용하여 로그 아웃하지 않고 모든 백그라운드 명령을 강제 종료 할 수 있습니다 .² 따라서 kill 0
근거는 오늘날 더 이상 정당화되지 않지만 이전 버전과의 호환성을 위해 유지되는 오래된 명령 처럼 보입니다.
그러나 쉘 면역을 만드는 것이 유용한 다른 유사한 상황이 있습니다. 터미널 호핑 프로세스가 있고 로그 아웃하지 않고 종료하려는 경우를 고려하십시오. 많은 시스템에는 pkill
터미널에서 실행중인 프로세스를 종료 할 수 있는 도구 가 있습니다. 신호를 무시하는 쉘을 제외하고 현재 터미널에서 실행중인 모든 프로세스를 실행 pkill -t $TTY
하거나 종료 pkill -QUIT -t $TTY
할 수 있습니다 .
쉘은 일반적으로 사용자가 (같은 명령으로 종료 할 때 어느 사라질 exit
또는 logout
말단 신호 입력의 단부 (사용자가 누름으로써이 발생할 수있는 경우), 또는 Ctrl+를 D) 또는 완전히 사라진다. 이 마지막 경우, 쉘은 SIGHUP 신호를 수신하며,이를 무시하지 않습니다.
X 세션에서 로그 아웃하는 유스 케이스의 경우 kill -15 -1
터미널 에뮬레이터를 종료하여 쉘이 SIGHUP을 수신하게하므로이를 수행합니다. 실제로 X 서버를 죽일 수는 있지만 프로세스 ID를 찾아야합니다. 동일한 명령이 텍스트 세션에서 작동하도록하려면을 사용할 수 있습니다 kill -15 -1; exit
. 그것은 어쨌든 당신의 손끝에 가지고있는 매우 위험한 명령입니다.
¹ 이것은 쉘 매뉴얼에서 일반적으로 언급되지 않은 것 같습니다. 기본 시스템 호출의 기능입니다. POSIX 사양에 명시 적으로 언급되어 있습니다.
² 요즘에는 jobs -l
프로세스 그룹 ID가있는 작업 목록을보고 프로세스 그룹을 종료 kill -123 -456 …
하기 위해 실행됩니다.
/bin/kill
아니면 껍질 내장? 후자라면, 쉘이 자체 내장으로 죽지 않을 것이라고 생각합니다.