Dtrace打印父进程命令

3
我希望有一个脚本,可以针对每个新的运行进程打印它的启动命令和父进程。
我使用以下探针:
proc::posix_spawn:exec-success,proc::__mac_execve:exec-success

在脚本体内,通过curproc->p_dtrace_argv构建命令行字符串。

父进程ID(ppid)也是可用的,但迄今为止我还没有找到如何提取父进程名称的方法(最好是从父进程argv [0]中获取的完整名称)。


你得到了什么输出? - Andrew Henle
以下是两个例子(我的格式是pid,ppid,日期,命令行):71414 1 2016年3月2日17:50:40 xpcproxy com.apple.cvmsCompAgent_x86_64 71414 1 2016年3月2日17:50:40 /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/CVMCompiler 2 - Zohar81
由于exec探针在exec-success探针调用成功之前在旧进程的上下文中触发,因此您是否可以像这样做self->pexecname = execname;exec探针下保存父执行名称,然后在exec-success探针下检索它? - Andrew Henle
1个回答

3
您可以在调用exec()之前,在proc:::exec探针中捕获进程的execname。这将是调用fork()的可执行文件的名称,并且将与父进程的execname匹配。我在Solaris 11上进行了测试。
#!/usr/sbin/dtrace -s

proc:::exec
{
    self->pexecname = execname;
}

proc:::exec-success
/ self->pexecname != 0 /
{
    printf( "execname: %s, parent execname: %s", execname, self->pexecname );
    self->pexecname = 0;
}

它生成了以下输出:
dtrace: script './exec.d' matched 2 probes
 CPU     ID                    FUNCTION:NAME
   6  12486         exec_common:exec-success execname: utmp_update, parent execname: gnome-pty-helper
  14  12486         exec_common:exec-success execname: bash, parent execname: gnome-terminal
  15  12486         exec_common:exec-success execname: ls, parent execname: bash

根据评论更新:

#!/usr/sbin/dtrace -s

proc:::exec
{
    self->pexecname = execname;
    self->parent_args = (build parent args off curproc here)
}

proc:::exec-success
/ self->pexecname != 0 /
{
    printf( "execname: %s, parent execname: %s", execname, self->pexecname );
    self->pexecname = 0;
    self->parent_args = 0;
}

proc:::exec-failure
/ self->pexecname != 0 /
{
    self->pexecname = 0;
    self->parent_args = 0;
}

谢谢,我已经成功地将你的代码集成到我的脚本中了。在 proc:::exec 探针中,还有其他类型的信息可以访问吗?如果能够获取父进程的命令行(通过 argv 数组获取)就太好了。 - Zohar81
@Zohar81 在调用exec之前,子进程的参数应该与父进程的参数相同。您可以像为子进程一样从curproc->p_dtrace_argv中构建父进程的参数。请参见更新内容。为了完整起见,我还添加了对self的清理,以防exec调用失败。 - Andrew Henle
你好,我又来了。在将argv解析器移植到你的脚本后,我遇到了一些无效地址。也许你可以在这里回答我的问题:http://stackoverflow.com/questions/35794993/dtrace-invalid-address-of-curproc-p-dtrace-argv-when-probing-procexec-succes。谢谢。 - Zohar81

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接