我想创建一个bash别名,它从我正在使用的当前bash会话中提供进程树,直到init。
用例是知道我是否使用了bash
或vi
的{{1}}命令。
我正在使用MacOS X.我听说过:shell
,但它似乎只显示孩子,而不是init和当前进程之间的关系。
答案 0 :(得分:5)
我确信通过一些谷歌搜索,您可以找到如何获取和下载Mac的pstree
。但是,您可以使用ps
和ppid
来制作一个穷人的版本。
例如
ps -eo ppid,pid,cmd | awk '{p[$1]=p[$1]","$3}END{ for(i in p) print i, p[i]}'
答案 1 :(得分:3)
pstree(1)
支持这一点,方法是使用一个选项仅显示特定PID的树并提供当前进程的PID(Bash中的$$
),该选项在GPL许可之间的命名方式不同版本由Werner Almesberger与Debian一起发布,而Fred Hucht发布的BSD版本随MacOS一起发布。
在Debian / Ubuntu上:pstree -s $$
init───gnome-terminal───bash───pstree
-s
选项摘要:
-s Show parent processes of the specified process.
在MacOS上:pstree -p $$
-+= 00001 root /sbin/launchd
\-+= 25706philipbranning/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal
\-+= 25716 root login -pfl philipbranning /bin/bash -c exec -la bash /bin/bash
\-+= 25722 philipbranning -bash
\-+= 32456 philipbranning pstree -p 25722
\--- 32457 root ps -axwwo user,pid,ppid,pgid,command
-p
选项摘要:
-p pid show only branches containing process <pid>
以下是MacOS的别名:
alias psme='pstree -p $$'
答案 2 :(得分:2)
我使用的是Mac OS 10.7 Lion,但我认为这对于其他类Unix系统上类似Bourne的shell来说是相当便携的。您可能在ps的参数中遇到命令关键字的问题。
我将以下代码放在一个名为procsup.sh的文件中,该文件定义了一个shell函数,用于跟踪进程的父进程到进程ID 1.(我经常发现shell函数比别名更容易使用。)
procsup()
{
leaf=$$
ps -eo pid,ppid,command | awk -v leaf="$leaf" \
'{parent[$1]=$2;command[$1]=$3;}
function print_ancestry(pid)
{
print pid " (" command[pid] ") child of " parent[pid];
if(pid!=1) print_ancestry(parent[pid])
};
END{\
print_ancestry(leaf)
}'
}
然后我启动了一个shell并获取了procsup.sh。在现实生活中,您将确保您的新shell在启动时自动获取procsup.sh,可能在您的个人.bashrc中。首先,我检查了那个shell的祖先。然后我从那个shell开始了vi。像往常一样,在我做:shell
之前,与vi的交互没有达到成绩单。我的终端窗口如下所示:
Mariel:~/Library/Scripts 1j david$
Mariel:~/Library/Scripts 1j david$
Mariel:~/Library/Scripts 1j david$ . procsup.sh
Mariel:~/Library/Scripts 1j david$ procsup
41926 (-bash) child of 41922
41922 (login) child of 41917
41917 (/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal) child of 19281
19281 (/sbin/launchd) child of 1
1 (/sbin/launchd) child of 0
Mariel:~/Library/Scripts 1j david$
Mariel:~/Library/Scripts 1j david$
Mariel:~/Library/Scripts 1j david$ vi
bash-3.2$ # Have just done :shell.
bash-3.2$ . procsup.sh
bash-3.2$ procsup
42325 (/bin/bash) child of 42324
42324 (vi) child of 41926
41926 (-bash) child of 41922
41922 (login) child of 41917
41917 (/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal) child of 19281
19281 (/sbin/launchd) child of 1
1 (/sbin/launchd) child of 0
bash-3.2$
bash-3.2$
答案 3 :(得分:1)
如果您使用像MacPorts这样的包管理器,则可以轻松安装pstree。
答案 4 :(得分:1)
我没有你想要的全部答案,但我有一个想法可能会让你朝着正确的方向前进。命令
declare -A parent
将创建一个关联数组(如果你说Perl,则为哈希)
您将需要一些命令,它将为您提供PID和PPID的名称 - 值对...我的猜测是,如果您足够折磨,可以使用mac的ps命令执行此操作。我将使用上面的'ps -eo',但你要填空。
然后你可以这样做:
ps -eo pid,ppid | while read pid ppid
do
parent[$pid]=$ppid
echo "pid: $pid ppid: ${parent[$pid]} grandppid: ${parent[${parent[$pid]}]}"
done
我无法让$ parent的值在我的while循环之外持久存在,否则我会创建第二个for循环来从$$返回到init。我将把它作为练习留给读者。