查看当前用户进程祖先并格式化输出

查看当前用户进程祖先并格式化输出

我用来ps -eo ppid,pid,cmd查看所有进程,如何格式化输出以如下所示查看?

只有给定的 PID 及其祖先才会打印(直到 init)。

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

我正在编写一个脚本来使用 PID 查看祖先进程,而不使用pstree,如果可能的话。

答案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在祖先中每个进程运行一个。您可以通过运行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 条目。

相关内容