docker通过内部进程的pid查找容器

时间:2016-12-01 12:55:36

标签: docker

我有泊坞容器。他们内部推出了一个过程。 从主机,命令top输出在容器内启动的所有进程的pid。

如何找到运行此PID的进程的容器?

谢谢。

5 个答案:

答案 0 :(得分:19)

感谢@Alex Past和@Stanislav的帮助。但我没有得到完整的答案。我把它们结合起来 总之,我有下一个。

第一

pstree -sg <PID>

其中PID是来自命令top

的进程的PID

在输出中,我获得了系统父进程的父PID。该PID是docker容器的PID。

执行后

docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Name}}' | grep "^%PID%"

其中%PID%是此父PID。

结果我有docker的 CONTAINER ID

这就是我想要的

答案 1 :(得分:3)

我想你需要这样的东西:

 docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Name}}' | grep "%PID%"

答案 2 :(得分:3)

您可以找到此过程的所有父母:

pstree -sg <PID>

此链将包含容器

答案 3 :(得分:1)

您应该能够对每个正在运行的容器使用exec来检查pid是否存在。当然,相同的进程id可以存在于多个容器中。这是一个小的bash脚本,它根据每个容器中提供的pid搜索正在运行的进程:

#!/bin/bash

for container in $(docker ps -q); do
  status=`docker exec $container ls /proc/$1 2>/dev/null`
  if [ ! -z "$status" ]; then
    name=`docker ps --filter ID=$container --format "{{.Names}}"`
    echo "PID: $1 found in $container ($name)"
    break;
  fi
done;

例如:

./find-process.sh 1

答案 4 :(得分:0)

您可以使用ps -o ppid=循环浏览目标进程的父进程,并在每一步检查父进程的PID是否与其中一个容器匹配。

#!/bin/bash

targetpid=$1
parentpid=0

while [ $parentpid != 1 ]; do
    parentpid=$(ps -o ppid= $targetpid)
    docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Name}}' | grep "^$parentpid"
    targetpid="$parentpid"
done
相关问题