簡體   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