2

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

4

2 回答 2

4

不,对于 UNIX 进程来说,没有完全可靠的事后知道 什么进程产生了它。当你的脚本(它的sh解释器)被execve()'d 时,它的父级可能已经终止或用另一个程序映像替换了自己。

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

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

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

于 2013-09-25T13:29:26.690 回答
1

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

以下是本网站上的几个使用示例:

$  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
...
...
...
于 2013-09-25T11:58:00.877 回答