2015-01-03 41 views
7

我有一個來自docker官方網站官方指南的簡單示例。如何殺死容器內的進程? Docker頂部命令

我運行以下:

sudo docker run -d ubuntu:latest /bin/sh -c "while true; do echo hello world; sleep 1; done" 
a66asdasdhqie123... 

然後取從創建容器的一些輸出:

sudo docker logs a66 
hello 
hello 
hello 
... 

然後我查找的容器的正在運行的進程:

sudo docker top a66 
UID     PID     PPID    C     STIME    TTY     TIME    CMD 
root    25055    15152    0     20:07    ?     00:00:00   /bin/sh -c while true; do echo hello world; sleep 1; done 
root    25295    25055    0     20:10    ?     00:00:00   sleep 1 

接下來,我試圖殺死集裝箱的第一道工序:

sudo docker exec a66 kill -9 25055 

然而,我沒有做任何改變。過程仍然有效,並且每秒輸出「hello」。我錯了什麼?

回答

8

當我複製你的情況我在docker top <container>docker exec -it <container> ps -aux之間看到不同的PID。當您執行docker exec時,該命令在容器中執行=>應該使用容器的PID。否則,你可以直接從主機上直接停止Docker,在你的情況下:sudo kill -9 25055

+1

,通常你會用'docker kill '來殺死這個進程。 –

+0

爲什麼PIDS在容器內的top和id之間有所不同?這是'top'命令在主機上顯示PIDS? (抱歉,無法檢查我現在在手機上的答案) –

+1

是的,'docker top'顯然顯示主機的PID。 –

1

檢查:

ps | grep -i a66 | tr -s ' '|cut -f2 -d' '| 
{ 
    while read line; 
    do kill -9 $line; 
    done 
} 

瞭解從執行命令該開始從留到每個管道的一端(|)

簡單的選擇:

kill $(pidof a66) 
+0

這是什麼? 'ps | grep -i a66'它不起作用 –

+0

什麼是返回狀態? –

+0

問題是爲什麼我的方式不工作,而不是如何做不同。 –

0

花了我一段時間才找到正確答案,但您將不得不從容器內管理此過程。當你從主機運行docker top a66時,PID是來自你的主機,儘管如果使用Cygwin,情況並非如此。無論如何,您需要登錄bash或返回到您的容器中,並在容器中使用命令ps auxkill,以查找和管理那裏的相同進程的不同PID。

0

我一直在尋找這樣的事情,但我找不到,然後我這樣做:

[根@筆記本〜]#搬運工EXEC -IT tadeu_debian的ps aux | grep ping | awk'{print $ 2}'| xargs -I {} docker exec -i tadeu_debian kill -9

這是來自Docker e one xargs的兩個「高管」。

嗯,我希望這可以幫助別人!