0

我正在寻找一个递归Makefile,我想看到完整的调用树,它让我到达了我所在的位置(包括所有参数等)。我不关心系统上的其他进程。

我正在寻找的本质上是pstree -ha,它只输出突出显示的部分(加上当前进程)。请注意,pstree -ha <PID>这不起作用,因为由于某种原因它没有显示父母的父母(它不会一直到 init)。我找到了另一个 SO answer ps -f -g$BINOSPID,但它显示了我不想要的兄弟姐妹。

拼出我正在寻找的内容:我想要的是:

~> sh 
sh-4.1$ bash
~> pstree -?? $$

init
`- sshd
   `- bash
      `- sh
         `- bash
            `- pstree -?? 1402

另外,作为一个附带问题,pstree -ha如果参数列表太长,它会自动截断参数列表。有没有办法避免这种情况?

4

1 回答 1

1

在本机 bash 中实现,具体取决于具有 procfs 的操作系统:

#!/usr/bin/env bash

pid=${1:-${BASHPID:-$$}}
while (( pid )); do
   mutated=0
   cmdline=( )
   while IFS= read -r -d '' piece || { [[ $piece ]] && mutated=1; }; do
       cmdline+=( "$piece" )
   done <"/proc/$pid/cmdline"
   printf '%s\t' "$pid"
   if (( mutated )); then
     printf '%s ' "${cmdline[@]}"
   else
     printf '%q ' "${cmdline[@]}"
   fi
   printf '\n'
   stat_data=$(<"/proc/$pid/stat") || break
   read _ ppid _ <<<"${stat_data##*')'}" || break
   [[ $ppid = "$pid" ]] && break
   pid=$ppid
done

如果不以 NUL 分隔符结尾,则设置该mutated标志。cmdline这意味着命令行已被运行的程序修改,并且不再包含其原始值。OpenSSH 尤其倾向于这样做。在这种情况下,我们不会将命令行视为 NUL 分隔的文字参数列表(并转义这些文字以生成可以在调用时复制和粘贴以生成相同命令的输出),而是将其视为已被格式化以供人类阅读。

我们正在解析"${stat_data##*')'}"出偏执狂,以防止)在其可执行名称中包含文字空格或字符的应用程序抛出对/proc/$pid/stat.

于 2018-02-06T17:13:40.553 回答