2015-01-03 123 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的两个“高管”。

嗯,我希望这可以帮助别人!