SIGTERM이 bash를 종료할 수 있지만 ash나 dash는 종료할 수 없는 이유는 무엇입니까?

SIGTERM이 bash를 종료할 수 있지만 ash나 dash는 종료할 수 없는 이유는 무엇입니까?

비교 bashash는 다음 에 의해서만 종료될 dash수 있습니다.bashSIGTERM

kill -TERM <pid>

그리고 ash나는 bash필요 SIGHUP하거나SIGKILL

kill -HUP <pid>
kill -KILL <pid>

그 이유는 무엇입니까? 또한 동작은 시스템에 따라 달라지는 것으로 보입니다.

  • bashSIGTERMUbuntu 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아니요SIGTERMCentOS 6, CentOS 7에서 종료

답변1

이는 bash가 readline줄 편집 라이브러리를 사용 하고 사용자 입력을 기다리는 경우에만 발생합니다.bash

실행하면 A는 bash --noediting죽지 않으며 SIGTERM스스로 죽지도 않습니다.bashkill -TERM $$

readline()이는 사용자 입력을 받는 bash 함수가 자체 신호 처리기를 설치 SIGTERM하고 반환하기 전에 원래 신호 처리를 복원하기 때문에 발생합니다 . 사용자 입력을 기다리는 동안 발생하면 반환됩니다 SIGTERM.readlinereadline()NULL

readline()( )를 호출하는 bash 함수 는 return을 로 해석 yy_readline_get()하여 쉘을 종료시킵니다. 이 장면이랑 너무 비슷해요NULLEOF답변.

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 메일링 리스트에 전달할 예정입니다.

관련 정보