現在のユーザーのプロセス親項目を表示して出力形式を指定します。

現在のユーザーのプロセス親項目を表示して出力形式を指定します。

すべてのプロセスを表示するために使用していますps -eo ppid,pid,cmd。次のように出力形式を指定するにはどうすればよいですか?

与えられたPIDとその親アイテムのみが印刷されます(初期化されるまで)。

23464   current
  |
23211   bash
  |
23210   sshd: xxW
  |
23193   sshd: WWcccv
  |
 728    /usr/sbin/sshd –D
  |
  1     init

pstree可能であれば、PIDを使用せずにPIDを使用して親プロセスを表示するスクリプトを作成しています。

答え1

たぶん、次のようなものがあります。

#! /bin/bash -
pid=${1?Please give a pid}
sep=
while
  [ "$pid" -gt 0 ] &&
    read -r ppid name < <(ps -o ppid= -o args= -p "$pid")
do
  printf "$sep%$((3+${#pid}/2))d%$((4-${#pid}/2))s%s\n" "$pid" "" "$name"
  sep=$'  |\n'
  pid=$ppid
done

これは作る:

$ that-script "$$"
13612  /bin/zsh
  |
 4137  SCREEN screen -xRS main
  |
 4136  screen screen -xRS main
  |
 4130  zsh
  |
 4128  xterm
  |
  1    /sbin/init splash

ps祖先はプロセスごとに1つずつ実行されるため、少し遅くなります。ps一度実行してすべての情報を検索して後処理することで、これを改善できますawk。たとえば、次のようになります。

#! /bin/sh -
pid=${1?Please give a pid}
ps -Ao pid= -o ppid= -o args= |
  awk -v p="$pid" '
    {
      pid = $1; ppid[pid] = $2
      sub(/([[:space:]]*[[:digit:]]+){2}[[:space:]]*/, "")
      args[pid] = $0
    }
    END {
      while (p) {
        printf "%s%*d%*s%s\n", sep, 3+length(p)/2, p, 4-length(p)/2, "", args[p]
        p = ppid[p]
        sep = "  |\n"
      }
    }'

答え2

pstree -spaを使うのはどうですか? pidやコマンドラインなど、特定のpidの前のエントリと祖先を表示します。

$ pstree -spa 3056
systemd,1
  └─upowerd,3056
      ├─{gdbus},3071
      └─{gmain},3069

答え3

pidとppidを配列に入れます。再帰関数または配列を介したループとして必要なpidおよびppidエントリのみを印刷します。

関連情報