unshare살인 작업을 안정적으로 만드는 패치

unshare살인 작업을 안정적으로 만드는 패치

~에서이 답변우리는 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다음 watchPID 1(내 우분투에서 시스템화됨)로 재설정하므로 모든 어린이를 죽이는 원하는 효과가 없습니다.

질문:

  • --fork원하는 효과를 달성하는 것이 왜 필요한가요? 포크를 unshare사용하는 것만으로 exec()는 충분 하지 않은 이유는 무엇입니까 ?
  • 해결책이 있나요? 나는 그 밑에 있는 모든 것을 죽이기 시작하여 kill -9생성된 PID 로 쉽게 보낼 수 있기를 원합니다. unshare그러나 kill을 사용하면 --fork시작할 때 반환된 pid는 내 PID 네임스페이스에 없기 때문에 unshare단순히 종료되고 unsharePID bash1로 재설정 됩니다.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"

관련 정보