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

How to kill process inside container? Docker top command

我在 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"。我做错了什么?

检查这个:

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

要理解这一点,请从每个管道的左侧到末端执行命令 (|)

更简单的选项:

kill $(pidof a66) 

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

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

我一直在寻找类似的东西,但找不到,然后我就这样做了:

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

从 Docker 到一个 xargs 是两个 "execs"。

好吧,我希望这对某人有所帮助!

构建 Docker 时,使用此命令:

RUN apt-get install lsof

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

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

记住:此命令会终止 GPU 上的所有进程