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