如何杀死容器内的进程? Docker顶级命令

时间:2015-01-03 17:15:41

标签: unix command-line process docker kill

我在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

然而,在我做出任何改变之后。进程仍然有效并且每秒输出“你好”。我错了什么?

5 个答案:

答案 0 :(得分:14)

当我重现您的情况时,我会在docker top <container>docker exec -it <container> ps -aux之间看到不同的PID。执行docker exec时,命令在容器内执行=&gt;应该使用容器的pid。否则你可以在没有docker的情况下直接从主机执行kill,在你的情况下:sudo kill -9 25055

答案 1 :(得分:1)

检查一下:

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

理解这一点从每个管道(|)

的从左到右执行命令开始

更简单的选项:

kill $(pidof a66) 

答案 2 :(得分:0)

我花了一些时间找到正确的答案,但你必须从容器内管理这个过程。当您从主机运行docker top a66时,PID来自您的主机,但如果使用Cygwin则情况并非如此。无论如何,你需要bash或者你有什么回到容器中并在容器中使用ps auxkill之类的命令来查找和管理不同的PID那里的过程。

答案 3 :(得分:0)

我正在寻找这样的东西,但我找不到,然后我这样做了:

  

[root @ notebook~] #docker exec -it tadeu_debian ps aux | grep ping |   awk'{print $ 2}'| xargs -I {} docker exec -i tadeu_debian kill -9

来自Docker e的两个“高手”是一个xargs。

嗯,我希望这有助于某人!

答案 4 :(得分:0)

当你构建 Docker 时,使用这个命令:

RUN apt-get install lsof

然后在 py 文件中你可以使用:

os.system("lsof /dev/nvidia* | awk '{print $2}' | xargs -I {} kill {}")

记住:这个命令会杀死 GPU 上的所有进程