【问题标题】:Getting the caller name of a script获取脚本的调用者名称
【发布时间】:2013-09-25 11:55:56
【问题描述】:

我有一个 unix 脚本。它已被其他脚本调用,但没有适当的参数。有没有办法查到来电者姓名? grep 没有帮助,因为脚本的名称通过多个脚本传递并动态调用。我想获得最终调用我的脚本的脚本?怎么样?

【问题讨论】:

    标签: unix process


    【解决方案1】:

    不,对于 UNIX 进程来说,不完全可靠地知道后验是什么进程产生了它。当您的脚本(其 sh 解释器)为 execve()'d 时,其父级可能已终止或将其自身替换为另一个程序映像。

    也就是说,您的脚本可以保持冷静,并根据进程表及其自身环境进行合理的猜测。

    ps -o args= $PPID 目前应该可以便携地向您显示脚本父级的命令行。这通常会起作用。

    如果 $PPID == 1,您已成为孤儿,init 是您的养父母。 ps -o uid-,gid=,pgid=,tty= $$ 将显示您的脚本的用户和组 ID、进程组 ID 和控制终端。这些通常直接从父级继承而无需修改,因此即使父级本身终止,也可以通过一点挖掘来帮助定位产生您的组的会话。

    【讨论】:

      【解决方案2】:

      您可以使用strace 实用程序,它允许跟踪系统调用。

      这是this site上的几个使用示例:

      $  strace ls
      execve("/bin/ls", ["ls"], [/* 21 vars */]) = 0
      brk(0)                                  = 0x8c31000
      access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
      mmap2(NULL, 8192, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb78c7000
      access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
      open("/etc/ld.so.cache", O_RDONLY)      = 3
      fstat64(3, {st_mode=S_IFREG|0644, st_size=65354, ...}) = 0
      ...
      ...
      ...
      

      【讨论】:

      • 如果 OP 知道 strace 是什么程序,那么 OP 就会知道哪个程序调用了他的脚本。
      猜你喜欢
      • 2021-04-16
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 2017-04-19
      • 2011-10-15
      • 2011-10-27
      • 2010-11-22
      相关资源
      最近更新 更多