私は完全なコマンド "/bin/child_process"または対応するpid(この場合は3996)を知っており、実行中であり、そのps auxf
親プロセスを視覚的に識別します/bin/parent_process foobar
。
root 3227 0.0 0.0 992 296 ? S<s 10:35 0:00 /bin/parent_process foobar
20058 3987 0.0 0.0 17716 1452 ? S<s 10:35 0:00 \_ /bin/bash
20058 3989 0.0 0.0 19240 1728 ? S< 10:35 0:00 \_ /bin/bash other_args
20058 3996 0.2 1.5 1621804 546104 ? S<l 10:35 0:54 \_ /bin/child_process
親プロセスが常に3レベル離れているわけではありません。 pid3996
またはコマンドを提供し/bin/child_process
て終了できるようにコマンドを使用して自動化する方法はありますか/bin/parent_process foobar
?特に、常に言うが/bin/parent_process
毎回異なるパラメータを使用します。特定の親プロセスを識別するために、foobar
出力をps auxf
階層にナビゲートすることは困難です。
ベストアンサー1
マンページからproc
(強調):
/proc/[pid]/stat
Status information about the process. This is used by ps(1).
It is defined in /usr/src/linux/fs/proc/array.c.
pid %d The process ID.
The fields, in order, with their proper scanf(3) format speci‐
fiers, are:
comm %s The filename of the executable, in parentheses.
This is visible whether or not the executable is
swapped out.
state %c One character from the string "RSDZTW" where R is
running, S is sleeping in an interruptible wait, D
is waiting in uninterruptible disk sleep, Z is zom‐
bie, T is traced or stopped (on a signal), and W is
paging.
-----> ppid %d The PID of the parent. <--------
...
したがって、必要なのは、/proc/<pid>/stat
PPID(親プロセスID)を解析してから解析することによって/proc/<ppid>/stat
行うことができます。それPPIDなどの方法でPPID 1が見つかるまで続きます。
既存のコマンドラインはで見つけることができます/proc/<ancestor_pid>/cmdline
。
メモ:
この方法とこれでそのような機能があるので、pstree
icyrock.com で述べた方法はどちらも *nix にproc
ファイルシステムがあると想定していますが、必ずしもそうではありません。ps
システムがそれをサポートしていると安全に想定できますprocfs
。
編集する:
以下は、上記のメソッドを実装するbashスニペットです(pid
他の場所で初期化されたと仮定)。
#Initialize ppid to any value (except 1) to start the loop:
ppid=2
while [[ $ppid -ne 1 ]]
do
ppid=$(cut -d' ' -f4 /proc/${pid}/stat)
if [[ $ppid -eq 1 ]]
then
cat /proc/${pid}/cmdline
fi
pid=$ppid
done