我想知道是否有办法可以追踪 Linux 中命令的运行位置。
例如,如果我调用一个脚本,有没有办法可以追踪它从哪里被调用,比如从程序或另一个 bash 脚本启动。
答案1
如果您的脚本是用 bash 编写的,则有一个名为 $PPID(我猜是父进程 ID 的缩写)的内置变量,您可以使用它来找出谁调用了您的脚本。以下是一个例子:
CALLER=$(ps ax | grep "^ *$PPID" | awk '{print $NF}')
echo I was called from $CALLER
解释:
- $PPID 给出父进程(调用者)的进程 ID
- 这附言命令列出所有进程
- 这grep命令查找行首包含 PPID 的行
- 这awk命令仅打印最后一列,即调用者的名称
答案2
“曾是我认为“从...运行”相当困难,除非在运行的可执行文件中有一些日志记录。如果执行完成,可能就没有什么可调查的了。
如果它是正在执行时,您可能只需使用 即可从父进程 id (PPID) 获取有关调用者的足够信息ps
。
答案3
如果进程仍在运行,那么您可以使用命令提供的分层可视化(也称为森林或进程树)ps
。
例如尝试:
ps xf
输出结果如下:
3627 ? Ss 0:00 /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
3655 ? S 0:38 \_ bwm --interface eth0 --download
3656 ? S 0:38 \_ bwm --interface eth0 --upload
3687 ? S 0:20 \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
574 ? S 0:00 | \_ sleep 1
3713 ? S 0:00 \_ wmiir read /event
3714 ? S 0:00 \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
22671 ? S 0:00 \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
22672 ? Ss 0:03 \_ xterm
22673 pts/0 Ss+ 0:00 \_ bash
答案4
Hai Vu 的答案可能升级如下:
ps -p $PPID -o args=
将-p
输出限制ps
为父进程的进程 ID。允许-o
您指定自己的输出,在本例中,我指定了args=
which(对我来说,它给出了我所寻找的内容)。可能的升级是,您无需获取大量信息,然后尝试解析它,而只需询问ps
您想要的信息。
一旦您有了,$PPID
您可能还会查看/proc/$PPID/
“目录”以获取更详细的信息。