【问题标题】:How to kill process inside container? Docker top command如何杀死容器内的进程? Docker 顶部命令
【发布时间】:2015-03-01 16:26:13
【问题描述】:

我有来自 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

但是,在我制作它之后,什么都没有改变。进程仍然有效并每秒输出“你好”。我哪里错了?

【问题讨论】:

    标签: unix command-line process docker kill


    【解决方案1】:

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

    【讨论】:

    • 当然,通常你会用docker kill <container> 终止进程。
    • 为什么容器内的 top 和 ids 的 PIDS 不同?那就是'top'命令在主机上显示PIDS? (抱歉暂时无法查看手机上的答案)
    • 是的,docker top 显然显示了主机的 PID。
    • 您可以从容器中获取 PID:docker inspect --format {{.State.Pid}} <container>
    【解决方案2】:

    检查一下:

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

    要理解这一点,首先要从每个管道从左到尾执行命令(|)

    更简单的选择:

    kill $(pidof a66) 
    

    【讨论】:

    • 退货状态如何?
    • 问题是为什么我的方式行不通,而不是如何以不同的方式做到这一点。
    • 对不起,我不喜欢你建议的方式——它很长而且不知所措。可能有更简单的选择吗?
    • 我已经编辑了答案(如果需要,添加 sudo)。希望这会有所帮助。
    • 这个答案是完全错误的。 Docker 容器 ID 不是由 ps 打印的。
    【解决方案3】:

    我花了一段时间才找到正确答案,但您必须在容器内管理此过程。当您从主机运行docker top a66 时,PID 来自您的主机,但如果使用 Cygwin,情况并非如此。无论如何,您都需要将bash 或what-have-you 返回到您的容器中,并在容器中使用ps auxkill 等命令来查找和管理同一进程的不同PID。

    【讨论】:

      【解决方案4】:

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

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

      这是来自 Docker 的两个“执行者”和一个 xargs。

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

      【讨论】:

        【解决方案5】:

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

        RUN apt-get install lsof
        

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-03
          • 1970-01-01
          相关资源
          最近更新 更多