2016-09-28 3 views
13

는 백그라운드에서 sleep 60을 실행하고 다음은, 종료 고려 :Docker 컨테이너의 PID1이 종료되면 다른 프로세스는 어떻게됩니까?

$ cat run.sh 
sleep 60& 
ps 
echo Goodbye!!! 
$ docker run --rm -v $(pwd)/run.sh:/run.sh ubuntu:16.04 bash /run.sh 
    PID TTY   TIME CMD 
    1 ?  00:00:00 bash 
    5 ?  00:00:00 sleep 
    6 ?  00:00:00 ps 
Goodbye!!! 

이것은 PID1로 bash과 더불어, 부두 노동자 컨테이너를 시작합니다. 그런 다음 sleep 프로세스를 포크/실행 한 다음 bash을 종료합니다. Docker 컨테이너가 죽으면 sleep 프로세스가 어떻게 든 죽습니다.

내 질문은 : sleep 프로세스가 종료되는 메커니즘은 무엇입니까? 나는 자식 프로세스에서 SIGTERM을 트랩하려고 시도했는데, 그것은 트립되지 않는 것처럼 보입니다. 컨테이너가 사용중인 cgroup을 종료 할 때 무언가 (Docker 또는 Linux 커널)가 SIGKILL을 보내는 것으로 추정되지만 아무 것도 발견하지 못했습니다. 당신의 init 프로세스 앱의 경우, 그것은 아마 단지 자체를하지 모두 종료거야,

:

편집 내가 설명 오셨습니다 가장 가까운 다음 baseimage-docker에서 인용입니다 컨테이너의 다른 프로세스. 그런 다음 커널은 정상적으로 종료 할 기회를주지 않고 다른 프로세스를 강제 종료하여 잠재적으로 파일 손상, 부실한 임시 파일 등을 초래할 수 있습니다. 모든 프로세스를 정상적으로 종료하고 싶습니다.

따라서 적어도 컨테이너가 종료되면 커널은 나머지 모든 프로세스에 SIGKILL을 보냅니다. 그러나 나는 그것을 (즉, cgroup의 특징입니까?) 결정하는 방법에 대한 명확성을 원합니다. 이상적으로는 더 권위있는 정보원이 좋을 것입니다.

답변

2

좋아요, 사실이게 실제로 리눅스 커널이 종료 중이라는 좀 더 확실한 증거를 제시 한 것 같습니다. clone(2) 사람 페이지에서이 유용한 섹션이있다 :

CLONE_NEWPID

(리눅스 2.6.24부터) 새로운 이름 공간 (에서 만든 첫 번째 과정 즉, CLONE_NEWPID 플래그를 사용하여 만든 과정)는 PID 1을 가지며 네임 스페이스에 대해 "init"프로세스입니다. 네임 스페이스 내에 고아가 된 자식이 인 경우 init (8) 대신이 프로세스에 대한 부모가됩니다. 기존 초기화 프로세스와 달리 PID 네임 스페이스의 "init"프로세스가 종료 될 수 있으며, 해당 프로세스가 있으면 의 모든 프로세스가 종료됩니다.

불행히도 이것은 네임 스페이스의 프로세스가 정확히 종료되는 방법에 대해 여전히 모호하지만, 보통 프로세스 종료와 달리 프로세스 테이블에 항목이 남아 있기 때문입니다. 사건이 무엇이든간에, 그것은 보인다 분명 그 :

  • 커널 자체가 그것을 만드는, 그들은 그들에게 정리를 할 수있는 기회를 허용하는 방법으로 살해되지 않은 다른 프로세스
  • 죽이고있다 (거의?항만 노동자`runc`가 청소를 할 수 있도록 당신이 ([호스트 PID 네임 스페이스에서 실행]하는 경우) SIGKILL과 동일는
+0

이 가능 https://github.com/opencontainers/runc/blob/c4e0d94efacd6f6fb353a538cc01d10792cc3a35 /libcontainer/state_linux.go#L41-L45). – Matt

+0

커널은'SIGKILL'을 보내 프로세스를 종료합니다. – Matt

+0

@Matt 잘 알고 있습니다. 그것들을 얻기위한 호스트'init' 프로세스의 책임이 될 것인가 아니면 커널이 프로세스 테이블 자체에서 그것들을 제거 하는가? –

관련 문제