我有泊坞容器。他们内部推出了一个过程。
从主机,命令top
输出在容器内启动的所有进程的pid。
如何找到运行此PID的进程的容器?
谢谢。
答案 0 :(得分:19)
感谢@Alex Past和@Stanislav的帮助。但我没有得到完整的答案。我把它们结合起来
总之,我有下一个。
第一
pstree -sg <PID>
其中PID是来自命令top
在输出中,我获得了系统父进程的父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