프로세스 자손

프로세스 자손

프로세스 컨테이너를 구축하려고 합니다. 컨테이너는 다른 프로그램을 트리거합니다. 예를 들어, 백그라운드 작업을 실행하는 bash 스크립트를 시작하려면 '&'를 사용하세요.

내가 추구하는 중요한 기능은 컨테이너를 종료할 때 컨테이너 아래에 생성된 모든 항목이 종료되어야 한다는 것입니다. 직계자녀뿐만 아니라 그 후손도 마찬가지다.

이 프로젝트를 시작했을 때 프로세스를 종료하면 해당 하위 프로세스도 자동으로 종료된다고 잘못 믿었습니다. 같은 오해를 갖고 있는 분들에게 조언을 구했습니다. 신호를 포착하여 아이에게 살인을 전가하는 것이 가능하지만, 내가 여기서 원하는 것은 그것이 아닙니다.

나는 xterm을 닫을 때 xterm에서 실행 중인 모든 것이 nohup'd가 아닌 이상 종료되기 때문에 내가 달성하려는 것이 달성 가능하다고 믿습니다. 여기에는 고아 프로세스가 포함됩니다. 그것이 제가 재현하고 싶었던 것입니다.

내가 찾고 있는 것이 유닉스 세션과 관련되어 있다는 생각이 있습니다.

프로세스의 모든 하위 항목을 식별하는 신뢰할 수 있는 방법이 있다면 임의의 신호를 해당 하위 항목에 보낼 수 있는 것도 유용할 것입니다. 예를 들어 SIGUSR1.

답변1

프로세스에 신호를 보내면 프로세스가 종료됩니다. 한 프로세스를 종료하면 다른 프로세스도 종료된다는 소문이 어떻게 시작되었는지 궁금합니다. 특히 직관에 어긋나는 것 같습니다.

그러나 여러 프로세스를 종료하는 방법이 있습니다. 그러나 프로세스에 신호를 보내지는 않습니다. 전부 죽일 수 있어프로세스 그룹-1234로 신호를 보냅니다. 여기서 1234는 프로세스 그룹 리더의 PID인 PGID(프로세스 그룹 ID)입니다. 당신이 실행할 때관로, 전체 파이프라인은 프로세스 그룹으로 시작됩니다(애플리케이션은 다음을 호출하여 이를 변경할 수 있습니다).setpgid또는setpgrp).

foo &백그라운드에서 프로세스를 시작 하면 ( ) 해당 프로세스는 자체 프로세스 그룹에 속하게 됩니다. 프로세스 그룹은 터미널에 대한 액세스를 관리하는 데 사용됩니다. 일반적으로 포그라운드 프로세스 그룹만 터미널에 액세스할 수 있습니다. 백그라운드 작업은 변경되지 않습니다.회의, 그러나 전체 세션을 종료하거나 세션의 프로세스 그룹이나 프로세스를 열거하는 도구가 없으므로 별로 도움이 되지 않습니다.

터미널을 닫으면 커널은 신호를 보냅니다.SIGHUP자신의 것으로 가지고 있는 모든 프로세스에제어 터미널. 이러한 과정대화를 나누다, 그러나 모든 세션에 제어 터미널이 있는 것은 아닙니다. 따라서 프로젝트의 경우 한 가지 가능성은 다음과 같이 실행하여 자체 터미널에서 모든 프로세스를 시작하는 것입니다.스크립트,화면기다리다. 터미널 에뮬레이터 프로세스를 종료하여 포함된 프로세스를 종료합니다(아직 연결되어 있지 않다고 가정).setsid).

다른 작업을 수행하지 않는 자체 사용자로 프로세스를 실행하여 더 많은 격리를 제공할 수 있습니다. 그러면 모든 프로세스를 쉽게 종료할 수 있습니다. 실행 kill(시스템 호출또는유용)을 해당 사용자로 지정하고 -1을 PID 매개변수로 사용하여 종료합니다. 이는 "이 사용자에 대한 모든 프로세스"를 의미합니다.

실제 환경에서 포함된 프로세스를 실행하면 더 많은 격리를 제공할 수 있지만 더 많은 설정이 필요합니다.컨테이너.

답변2

프로세스의 모든 하위 항목을 식별하는 안정적인 방법은 pstree <pid>pid가 상위 프로세스 ID인 명령을 사용하는 것입니다.

매뉴얼 페이지 읽기pstree 여기.

프로세스 그룹의 모든 구성원에게 신호를 보냅니다. killpg(<pgrp>, <sig>);
여기서 pgrp는 프로세스 그룹 번호이고 sig는 신호입니다.

지정된 프로세스 그룹의 하위 프로세스를 기다립니다.waitpid(-<pgrp>, &status, ...);

현재 수행 중인 작업의 대안은 새 bash 셸에서 프로세스 컨테이너를 실행하는 것입니다. 이 명령을 사용하여 새 bash 셸을 만들고 bash프로세스를 실행하세요. 모든 프로세스를 종료하려면 명령을 사용하여 쉘을 종료하십시오 exit.

답변3

상위 스크립트에서 종료 신호를 포착하고 모든 하위 프로세스를 종료하도록 합니다. 예를 들어,

#!/bin/bash
# kill the parent and children together
trap "kill 0" EXIT
# create all the children
for n in $(seq 1 100)
do
    ( echo "begin $n"; sleep 60; echo "end $n" ) &
done
# wait for the children to complete
wait

답변4

사용

unshare -fp --kill-child -- yourprogram

Kill 하면 unshare모든 하위 프로세스( yourprogram생성되었을 수 있음)가 종료됩니다.

이제 util-linux를 통해 가능합니다 2.32.나는 이것을 업스트림에서 구현했습니다.. 사용자 네임스페이스(커널 구성 옵션 CONFIG_USER_NS=y) 또는 루트 권한이 필요합니다. 당신은 또한 볼 수 있습니다여기.

관련 정보