跟踪 Linux Bash 调用

跟踪 Linux Bash 调用

我想知道是否有办法可以追踪 Linux 中命令的运行位置。

例如,如果我调用一个脚本,有没有办法可以追踪它从哪里被调用,比如从程序或另一个 bash 脚本启动。

答案1

如果您的脚本是用 bash 编写的,则有一个名为 $PPID(我猜是父进程 ID 的缩写)的内置变量,您可以使用它来找出谁调用了您的脚本。以下是一个例子:

CALLER=$(ps ax | grep "^ *$PPID" | awk '{print $NF}')
echo I was called from $CALLER

解释:

  1. $PPID 给出父进程(调用者)的进程 ID
  2. 附言命令列出所有进程
  3. grep命令查找行首包含 PPID 的行
  4. 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/“目录”以获取更详细的信息。

相关内容