我在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
然而,在我做出任何改变之后。进程仍然有效并且每秒输出“你好”。我错了什么?
答案 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 aux
和kill
之类的命令来查找和管理不同的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 上的所有进程