저는 다음과 같은 문제로 AskUbuntu 사용자를 도우려고 합니다.
문맥:-
저는 bash에서 프로세스를 실행하고
&
즉, 백그라운드 모드로 연결하고 있습니다. 프로세스에는 하나가 있습니다while(1)
. 즉, 영원히 실행됩니다. 내 bash는 상위 프로세스이고 내 프로세스는 하위 프로세스입니다. 상위 프로세스가 종료될 때 커널이 하위 프로세스를 처리하는 방법을 이해하고 싶습니다.관찰 결과:-
- 터미널을 종료하면(
exit
터미널 명령을 사용하여)/lib/systemd/systemd --user
하위 프로세스의 상위 프로세스가 됩니다.kill
다른 터미널에서 터미널 프로세스를 종료하면 결과는 위와 동일합니다.- 십자 아이콘을 사용하여 터미널을 닫으면 하위 프로세스도 종료됩니다.
질문:-
종료와 종료/종료의 차이점은 무엇입니까?
답변을 작성했지만 무슨 일이 일어나고 있는지 잘 이해하지 못하는 것 같고 Unix 및 Linux에서 도움을 주는 몇몇 사람들이 나보다 더 잘 알고 무슨 일이 일어나고 있는지 설명할 수 있다고 생각합니다.
따라서 AskUbuntu에서 시도한 대신에 답변을 연결하고 작성하여 이해하도록 도와주세요.
답변1
1에 대한 답은 자식을 생성하기 전에 호출하여 "자식 사신"이 되기 systemd --user
때문에 고아(즉, pid 1 = init 역할 수행)를 취하는 것 입니다. prctl(PR_SET_CHILD_SUBREAPER, 1)
이것은 리눅스 확장입니다.
3에 대한 대답은 터미널 에뮬레이터에 따라 다릅니다. 그들은 같은 방식으로 작동하지 않습니다.
그러나 일반적으로 1,2,3의 차이점은 후자의 경우입니다.세게 때리다신호[1]를 수신 SIGHUP
하고 이를 하위 프로세스로 다시 전송하여 백그라운드 프로세스가 종료됩니다.
쉘 [즉, bash]는
SIGHUP
종료하기 전에 .인터렉티브SIGHUP
쉘은 실행 중이거나 중지된 모든 작업에 다시 전송됩니다 . 중지된 작업을 보내서SIGCONT
수신되었는지 확인하세요SIGHUP
.
이것은배쉬 확장;모든 쉘이 SIGHUP
신호를 다시 보내는 것은 아닙니다. 특히 대시( /bin/sh
Ubuntu의 경우)는 그런 작업을 수행하지 않습니다.
SIGHUP
그러나 사례 1의 경우에도 백그라운드 프로세스의 프로세스 그룹에서 중지된 프로세스가 있는 경우(시뮬레이트된 터미널 에뮬레이터 사용 script
) 신호를 얻을 수 있습니다.
$ script -q /dev/null -c /bin/bash
$ sh -c 'sleep 1 & kill -STOP $!; echo $$; while sleep 1; do :; done' &
[1] 3317
$ 3317
$ exit
exit
$ ps 3317
PID TTY STAT TIME COMMAND
# 3317 is dead.
이것중지됨(아니요잠) sleep
프로세스가 상위 프로세스를 삭제했습니다. 이 부분을 빼면 sleep 1 & kill -STOP $!
살아납니다.
이전 기능과 달리 이는 운영 체제의 표준 기능이며 bash 또는 기타 쉘에만 있는 고유한 기능이 아닙니다.
SIGHUP
[1] bash 는 포그라운드 프로세스 그룹에 있고 터미널 에뮬레이터가 의사 터미널을 파괴했거나(커널이 이를 보내도록 함 SIGHUP
) 명시적으로 자체적으로 보냈기 때문에 신호를 받습니다 SIGHUP
.
답변2
하위 프로세스에는 항상 상위 프로세스가 있어야 합니다. 모든 프로세스에는 상위 프로세스 PID가 있습니다.
처음 두 경우에는 상위 프로세스를 종료하므로 프로세스가 잘못된 상위 ID를 갖게 됩니다. Unix(및 Posix)에서는 init
이러한 프로세스가 채택되고(요즘 일반적으로 시스템화되는 PID 1을 사용하는 프로세스) 이러한 프로세스는 신호를 받게 됩니다(따라서 새로운 하위 프로세스를 채택해야 한다는 것을 알 수 있습니다. 어쩌면 그냥 죽여라. 죽어라). 이것은 또한 init
(따라서 systemd가 중요한 이유입니다. 중요한 프로세스가 종료되거나 고아가 되었는지 확인하고 조치를 취할 수 있습니다).
세 번째 경우는 더욱 흥미롭다. 참고: 이 경우 터미널을 종료하지 않고 터미널에 종료하라고 지시하면 터미널이 해당 항목을 정리할 시간을 갖게 됩니다.
이제 다른 유형의 프로세스, 제어 그룹 및 작업 제어가 있습니다. 복잡한 주제: 터미널은 터미널 부분(입력 처리 및 문자 그리기 방법)을 중지하지만 터미널(요즘에는 일반적으로 Pasudo 터미널, 확실히 x의 의사 터미널)은 SIGHUP
이러한 프로세스에 다른 쪽 끝이 중단되도록 보냅니다. 위로. 일반적으로 이는 해당 제어 그룹의 모든 프로세스를 종료하는 것과 같습니다. 프로그램은 터미널에 신호를 무시하거나 더 나은 종료를 위해 해당 신호를 처리하도록 지시할 수 있습니다(보통 화면을 재설정하여). ( nohup
SIGHUP 신호가 발생하는 경우 프로세스를 계속 실행하는 데 유틸리티를 사용할 수 있습니다.)
따라서 차이점은 다음과 같습니다. 1과 2는 SIGHUP을 하위 프로세스에 보낼 수 없는 상위 프로세스를 종료하므로 PID 1이 이를 처리합니다(참고: 사용할 수 없는 경우 stdin 및 stdout을 종료할 수 있지만 이는 상위 프로세스에 따라 다름). 프로세스). 3 단말기는 잘 종료되고 상대방이 전화를 끊었으니 원활하게 처리해야 함을 아이들에게 알립니다.