비교 bash
및 ash
는 다음 에 의해서만 종료될 dash
수 있습니다.bash
SIGTERM
kill -TERM <pid>
그리고 ash
나는 bash
필요 SIGHUP
하거나SIGKILL
kill -HUP <pid>
kill -KILL <pid>
그 이유는 무엇입니까? 또한 동작은 시스템에 따라 달라지는 것으로 보입니다.
bash
SIGTERM
Ubuntu 14.04 Trusty, Ubuntu 16.04 Xenial, Ubuntu 18.04 Bionic, Ubuntu 19.10 Eoan, Ubuntu 20.04 Focal, Debian 8 Jessie, Debian 9 Stretch, Debian 10 Buster, CentOS 8에서 종료bash
예아니요SIGTERM
CentOS 6, CentOS 7에서 종료
답변1
이는 bash가 readline
줄 편집 라이브러리를 사용 하고 사용자 입력을 기다리는 경우에만 발생합니다.bash
실행하면 A는 bash --noediting
죽지 않으며 SIGTERM
스스로 죽지도 않습니다.bash
kill -TERM $$
readline()
이는 사용자 입력을 받는 bash 함수가 자체 신호 처리기를 설치 SIGTERM
하고 반환하기 전에 원래 신호 처리를 복원하기 때문에 발생합니다 . 사용자 입력을 기다리는 동안 발생하면 반환됩니다 SIGTERM
.readline
readline()
NULL
readline()
( )를 호출하는 bash 함수 는 return을 로 해석 yy_readline_get()
하여 쉘을 종료시킵니다. 이 장면이랑 너무 비슷해요NULL
EOF
답변.
SIGTERM
이는 대화형 bash가 설정으로도 살아남을 수 있음을 의미합니다 IGNOREEOF
;-):
$ bash
$ IGNOREEOF=10
$ echo $$
11096
<kill -TERM 11096 from another terminal>
$ Use "exit" to leave the shell.
<kill -TERM 11096 from another terminal>
$ Use "exit" to leave the shell.
...
<the 10th will get it>
$ exit
$
답변2
이것은 나에게 예상치 못한 일이었지만 몇 가지 빌드를 수행한 후에 git의 bash 최신 코드에서는 재현될 수 있지만 bash 4.0에서는 재현될 수 없다는 것을 발견했습니다. 따라서 이는 git bisect
다음 커밋이 책임이 있는 것으로 식별하는 데 도움이 됩니다.
% git bisect good
ac50fbac377e32b98d2de396f016ea81e8ee9961 is the first bad commit
commit ac50fbac377e32b98d2de396f016ea81e8ee9961
Author: Chet Ramey <[email protected]>
Date: Wed Feb 26 09:36:43 2014 -0500
Bash-4.3 distribution sources and documentation
Bash에 대한 개별 git 커밋은 상당히 큰 경향이 있고 범위는 그리 엄격하지 않습니다. 하지만 커밋을 탐색하는 데 몇 분만 투자하면 SIGTERM이 우회해야 하는 새로운 rl_signal_event_hook을 포함하여 readline이 SIGTERM을 처리하는 방식에 대한 여러 변경 사항이 드러날 것입니다. 많은 수의 새로운 우리는 SIGTERM을 확인하고 장소를 호출합니다 termsig_handler
.
이러한 변경 사항 중 일부는 변경 로그의 새 항목과 일치합니다.
Readline은 입력을 읽는 동안 신호를 수신한 후(읽기가 -1/EINTR을 반환하지만 readline은 신호를 즉시 처리하지 않음) 애플리케이션이 설정한 이벤트 후크(rl_signal_event_hook)를 호출하여 애플리케이션이 신호를 처리하거나 기록할 수 있도록 합니다. SIGHUP 또는 SIGTERM은 현재 호출되지 않습니다.
이번 소식으로 볼 때, 이러한 행동 변화는 의도적인 것이 아닐 수도 있다는 생각이 듭니다.
이것이 의도적인 것인지 알아보기 위해 이 게시물을 bug-bash 메일링 리스트에 전달할 예정입니다.