터미널 에뮬레이터가 SIGKILL을받은 후 어떻게 자녀를 죽일 수 있습니까?


12

내가 이해 한 바에 따르면 SIGKILL은 잡을 수 없습니다. 이것은 프로세스가 OS가 프로세스를 파괴하기 전에 프로세스의 자식을 죽일 시간이 없다는 것을 의미합니다. 이것은 쉘 스크립트로 보여줄 수 있습니다.

#! /bin/bash

trap : SIGTERM SIGINT SIGKILL # SIGKILL is pointless.

mplayer video.avi

SIGKILL로 죽이면 mplayer가 실행됩니다.

$ kill -9 $pid

그러나 터미널 에뮬레이터 (xterm, Terminal 등)를 사용하면 자식과 함께 죽습니다. 이것이 어떻게 가능한지?

$ mplayer

그리고 죽여라 :

$ kill -9 $terminal_pid

그리고 mplayer는 배와 함께 내려갑니다. 터미널 에뮬레이터가 어떻게 든 SIGKILL을 잡거나 여기에 다른 힘이 있습니까?

답변:


11

시작한 프로세스 xterm는 터미널을 제어하는 ​​세션 리더가됩니다.

터미널이 사라지면 해당 프로세스는 자동으로 SIGHUP 신호를 수신합니다 (SIGCONT가 뒤 따름). 이것은 CTRL-C를 누를 때 프로세스가 SIGINT를받는 것과 비슷한 방식으로 커널에 의해 전송됩니다.

또한, 쉘은 종료시 SIGHUP을 일부 자식에게 보낼 수 있습니다 ( disown해제하려면 일부 쉘 참조 )


1
: 세션 및 세션 지도자들에 대한 정보를 들어 unix.stackexchange.com/questions/18166/... .
Kevin Cox

+1 disown매우 유용합니다.
math

1

귀하의 질문에 대한 답변은 이러한 프로세스가 터미널 에뮬레이터에서 하위로 실행되기 때문에 발생합니다. 따라서 터미널 에뮬레이터를 종료하면 모든 자식 프로세스가 종료됩니다 (자녀가 제어 터미널 에뮬레이터와 동일한 프로세스 그룹에서 실행 중이므로).

예를 들어 다음을 참조하십시오.

csb@darwin[~]$ ps fauwx | grep -A6 "xfce4-terminal" | awk '{ for (i = 2; i <= 9; i++) $i="" ; print $0 }' 
csb         0:32 xfce4-terminal --geometry=271x65 --display :0.0 --role=Terminal-0x1340050-2606-1351620352 --show-menubar --show-borders --hide-toolbars --working-directory /home/csb --tab --working-directory /home/csb
csb         0:00 \_ gnome-pty-helper
csb         0:00 \_ bash
csb         0:00 | 
                  \_ ssh [redacted]
csb         0:00 \_ bash
csb         0:00 \_ ps fauwx
csb         0:00 \_ grep --color=auto -A6 xfce4-terminal
csb         0:00 \_ awk { for (i = 2; i <= 9; i++) $i="" ; print $0 }

이러한 모든 프로세스는 'xfce4-terminal'프로세스에서 실행되므로 해당 프로세스를 종료하면 프로세스 그룹의 모든 하위 프로세스가 자동으로 종료됩니다. 예를 들어 터미널 에뮬레이터 창을 종료하는 것과 같은 방식입니다. 반드시 SSH 연결을 끊으십시오.

쉘과 같은 프로그램은 일반적으로 관련 하위 프로세스를 그룹에 배치하여 새 프로세스 그룹을 작성합니다. 각 작업은 프로세스 그룹입니다. 커널 외부에서 쉘은 killpg 시스템 호출을 사용하여 작업을 프로세스 그룹에 전송하여 작업을 처리합니다.이 프로세스는 프로세스 그룹의 모든 프로세스에 신호를 전달합니다.


3
-1 : 부모를 죽이는 것은 수행 하지 아이들이 사망하는 원인.
camh

2
쉘과 같은 프로그램은 일반적으로 관련 하위 프로세스를 그룹에 배치하여 새 프로세스 그룹을 작성합니다. 각 작업은 프로세스 그룹입니다. 커널 외부에서 쉘은 killpg 시스템 호출을 사용하여 작업을 프로세스 그룹에 전송하여 작업을 처리합니다.이 프로세스는 프로세스 그룹의 모든 프로세스에 신호를 전달합니다.
Charles Boyd

2
@CharlesBoyd 그 의견은 답변의 일부 여야합니다.
jordanm

4
@CharlesBoyd : 답변에 추가하면 -1 대신 +1을 줄 것입니다. 귀하의 답변은 현재 부모 프로세스가 종료 될 때 자식 프로세스가 종료 된 것처럼 읽습니다 (BTW, 프로세스 그룹 기반이 아닌 세션 기반).
camh

@CharlesBoyd 이해합니다. 그러나 문제의 핵심은 SIGKILL을받을 때 "신호를 보내서 작업을 조작하는 방법"입니다. killpg그 시점에서 시스템 호출 을 사용할 수있는 방법이 없습니다 .
Kevin Cox

0

먼저,를 사용하여 살해 된 터미널에서 살아남은 mplayer를 재현 할 수 없습니다 xterm.

그것이 죽는 이유는 그것이 부모의 죽음으로부터 SIGHUP을 받기 때문입니다.


나는 그것이 결코 말하지 않았고, 그것이 죽었지 만 스크립트에있을 때 살아남고 죽었다고 말했다.
Kevin Cox

대본에서 살아남지 못합니다.
tumbleweed
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.