繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM