[英]docker find container by pid of inside process
我有码头集装箱。 在他们里面展开了一个过程。 从主机,命令top
输出容器内启动的所有进程的 pid。
如何找到一个容器,在该容器中运行具有此 PID 的进程?
谢谢你。
谢谢@Alex Past 和@Stanislav 的帮助。 但我没有得到完整的答案。 我把它们结合起来。
总之,我有下一个。
首先
pstree -sg <PID>
其中 PID 是来自命令top
的进程的 PID
在输出中,我获得了 systemd 父进程的父 PID。 这个PID是docker容器的PID。
我执行后
docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Name}}' | grep "^%PID%"
其中%PID%是这个父 PID。
结果我有码头工人的CONTAINER ID 。
这就是我想要的
我想你需要这样的东西:
docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Name}}' | grep "%PID%"
您可以找到此过程的所有父项:
pstree -sg <PID>
该链将包含容器
您应该能够对每个正在运行的容器使用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
您可以使用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
我有点结合所有这些并写了这两个班轮。 希望对某人有用。
#!/bin/bash
SCAN_PID=`pstree -sg $1 | head -n 1 | grep -Po 'shim\([0-9]+\)---[a-z]+\(\K[^)]*'`
docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Name}}' | grep "${SCAN_PID}"
第一行找到容器入口脚本并将其提供给 docker inspect。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.