Unix 如何杀死容器内的进程?Docker最高指挥部
我有一个简单的例子,来自docker网站的官方指南 我运行以下命令:Unix 如何杀死容器内的进程?Docker最高指挥部,unix,command-line,process,docker,kill,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
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
然后我查找容器的运行进程:
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
接下来,我尝试终止容器的第一个进程:
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”。我做错了什么?检查以下内容:
ps | grep -i a66 | tr -s ' '|cut -f2 -d' '|
{
while read line;
do kill -9 $line;
done
}
要理解这一点,请从执行命令开始,从左到每根管道的末端(|)
更简单的选择:
kill $(pidof a66)
当我重现您的情况时,我看到
docker-top
和docker-exec-it-ps-aux之间存在不同的PID。执行docker exec
时,命令在容器内执行=>应使用容器的pid。否则,您可以在没有docker的情况下直接从主机执行kill,在您的情况下:sudo kill-9 25055
我花了一段时间才找到正确的答案,但您必须从容器中管理此过程。当您从主机运行docker top a66
时,PID来自您的主机,尽管使用Cygwin时情况并非如此。无论如何,您将需要bash
或您已返回到容器中的内容,并在容器中使用ps aux
和kill
等命令来查找和管理相同进程的不同PID。我正在查找类似的内容,但找不到,然后我这样做了:
[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 one xargs的两名“执行官”
好吧,我希望这能帮助别人 构建Docker时,请使用以下命令:
RUN apt-get install lsof
然后在py文件中,您可以使用:
os.system("lsof /dev/nvidia* | awk '{print $2}' | xargs -I {} kill {}")
记住:这个命令杀死GPU上的所有进程返回状态是什么?问题是为什么我的方式不起作用,而不是如何做不同的。对不起,但我不喜欢你建议的方式-它很长,而且不知所措。可能还有更简单的选择吗?我已经编辑了答案(如果需要,添加sudo)。希望这能有所帮助。这个答案显然是错误的。Docker容器ID不是由ps
打印的。通常情况下,您会使用Docker kill
终止进程。为什么容器内部的ID和顶部的PID不同?“top”命令在主机上显示PID?(很抱歉,我现在在手机上无法查看答案)是的,docker-top
显然显示主机的PID。您可以从容器中获取PID作为:docker-inspect--format{{.State.PID}