Dtrace打印父进程命令

时间:2016-03-02 16:05:39

标签: macos parent-child dtrace mach xnu

我希望有一个脚本,为每个新的运行进程打印它的启动命令,以及它的父进程。

我使用以下探针:

proc::posix_spawn:exec-success,proc::__mac_execve:exec-success

在脚本体内,命令行字符串是从curproc->p_dtrace_argv构建的。

父pid(ppid)也可用,但到目前为止,我还没有设法弄清楚如何提取父进程名称(最好是可以从父argv [0]获取的全名)。

1 个答案:

答案 0 :(得分:2)

您可以在d.active探针中调用exec()之前捕获进程的execname。这将是调用proc:::exec的可执行文件的名称,并将与父进程的fork()匹配。

我在Solaris 11安装上测试了这个:

execname

它产生了以下输出:

#!/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