~에서이 답변우리는 Linux PID 네임스페이스를 통해 전체 프로세스 하위 트리를 안정적으로 종료할 수 있다는 것을 배웠습니다 unshare -p
.
내가 이해하지 못하는 문제는 다음과 같습니다.
-f
--fork
/ 옵션을 사용하여 공유를 취소 한 경우에만 작동합니다 .unshare -fp -- bash -c "watch /bin/sleep 10000 && echo hi"
이것을 실행하면
kill -9
그 PID가bash
원하는 대로 감시, 잠자기 등이 모두 종료됩니다.하지만 내가 그것을 사용할 때 아무것도
-f
:unshare -p -- bash -c "watch /bin/sleep 10000 && echo hi"
PID를 bash 한
kill -9
다음watch
PID 1(내 우분투에서 시스템화됨)로 재설정하므로 모든 어린이를 죽이는 원하는 효과가 없습니다.
질문:
--fork
원하는 효과를 달성하는 것이 왜 필요한가요? 포크를unshare
사용하는 것만으로exec()
는 충분 하지 않은 이유는 무엇입니까 ?- 해결책이 있나요? 나는 그 밑에 있는 모든 것을 죽이기 시작하여
kill -9
생성된 PID 로 쉽게 보낼 수 있기를 원합니다.unshare
그러나 kill을 사용하면--fork
시작할 때 반환된 pid는 내 PID 네임스페이스에 없기 때문에unshare
단순히 종료되고unshare
PIDbash
1로 재설정 됩니다.unshare
&& echo hi
명령을 실행하면 이 bash -c
작업이 수행되므로 exec()
bash 프로세스가 사라지고(대체되고) 해당 PID를 삭제할 수 없기 때문에 이 작업 이 필요합니다.
답변1
상술 한 바와 같이이 유용한 답변에서-n
( )의 효과는 unshare(CLONE_NEWPID)
포크의 첫 번째 하위 프로세스에만 영향을 미칩니다.
특히,남자 2 공유 해제물론 CLONE_NEWPID
:
호출 프로세스가 기존 프로세스와 공유되지 않는 하위 프로세스에 대한 새 PID 네임스페이스를 갖도록 PID 네임스페이스 공유를 해제합니다.
호출 프로세스는 새 네임스페이스로 이동되지 않습니다.
호출 프로세스에 의해 생성된 첫 번째 하위 프로세스
init(1)
프로세스 ID 1을 가지며 새 네임스페이스에서 역할을 맡습니다.
unshare
살인 작업을 안정적으로 만드는 패치
내 질문을 받은 후 지난 몇 시간 동안 나는 패치를 작성했습니다 util-linux
(여기에서 요청을 끌어오세요) 에 --kill-child
플래그를 추가합니다 unshare
.
편집하다:이제 util-linux 의 일부로 병합되어 릴리스되었습니다 v2.32
.
다음과 같이 사용할 수 있습니다.
unshare -fp --kill-child -- bash -c "watch /bin/sleep 10000 && echo hi"
종료 하면 unshare
예상대로 전체 프로세스 트리가 찢어집니다.
아니요root
root
커널에 CONFIG_USER_NS=y
플래그를 전달하여 사용자 네임스페이스를 활성화( )한 경우 권한 없이 사용할 수도 있습니다 -U
.
unshare -Ufp --kill-child -- bash -c "watch /bin/sleep 10000 && echo hi"