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

b09cbbtk  于 2023-11-17  发布在  Docker
关注(0)|答案(6)|浏览(153)

我有一个Docker容器。在它们里面启动了一个进程。从主机命令top输出在容器里面启动的所有进程的pid。
我如何找到一个容器,在其中运行具有此PID的进程?
谢谢

dced5bon

dced5bon1#

感谢@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。
在结果中,我有Docker的 CONTAINER ID
这就是我想

zvms9eto

zvms9eto2#

我想你需要这样的东西:

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

字符串

iszxjhcz

iszxjhcz3#

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

pstree -sg <PID>

字符串
这条链将包含容器

aydmsdu9

aydmsdu94#

我有点结合所有这些和写这两个班轮。希望有用的人。

#!/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。

628mspwn

628mspwn5#

你应该能够对每个正在运行的容器使用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

enxuqcxy

enxuqcxy6#

您可以使用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

字符串

相关问题