2

新しい実行中のプロセスごとに、開始コマンドとその親プロセスを出力するスクリプトが必要です。

私は次のプローブを使用しています:

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

スクリプト本体内から、コマンド ライン文字列が から作成されcurproc->p_dtrace_argvます。

親 pid (ppid) も利用できますが、これまでのところ、親プロセス名 (できれば親 argv[0] から取得できるフルネーム) を抽出する方法を理解できていません。

4

1 に答える 1

2

exec()プローブでの呼び出しの前に、プロセスの execname を取得できますproc:::exec。これは、呼び出した実行可能ファイルの名前になり、親プロセスの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;
}
于 2016-03-02T21:08:17.223 に答える