2016-12-01 51 views
5

我有码头集装箱。他们内部推出了一个流程。 从主机,命令top输出在容器内启动的所有进程的PID。码头找到内部进程的pid容器

我怎样才能找到一个容器,在这个容器中运行这个PID过程?

谢谢。

回答

8

谢谢@Alex过去和@Stanislav的帮助。但我没有得到完整的答案。我结合他们。
总之,我已经得到了下一个。

首先

pstree -sg <PID> 

PID是从命令top

在输出我得到家长的PID为systemd父进程的PID号。这个PID是码头集装箱的PID。

我执行后

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

其中%PID%是该父PID。

因此,我有码头的CONTAINER ID

这就是我想要的

+0

您应该将此标记为接受的答案=) – Cyclonecode

2

我想你需要的是这样的:

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

你可以找到所有的父母对这个过程:

pstree -sg <PID> 

此链将包含容器

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 
+0

所以你总是在容器中的docker exec' 7dd276808aec?这看起来很虚假。 – user2915097

+0

@ user2915097 - 糟糕,我会更新。当然,你需要执行每个正在运行的容器并检查是否存在'/ proc/'目录。 – Cyclonecode

相关问题