Как мне найти, какие процессы (с аргументами) выполняются в OS X (Leopard) в течение определенного периода времени?

Я пытаюсь выяснить, какие процессы выполняет конкретный процесс на компьютере с OS X (включая аргументы). Я раньше не использовал DTrace, но подумал, что это должно быть тривиально. Посмотрев вокруг на примеры, я нашел это, которое выглядит точно так, как я хочу:

$ sudo dtrace -n 'proc:::exec-success { trace(curpsinfo->pr_psargs); }'

Только это не работает должным образом. Один из сайтов, которые перечислили эту команду, имел пример вывода, который выглядел отлично, но когда я пытаюсь запустить его на OS X, я получаю следующее:

dtrace: description 'proc:::exec-success ' matched 2 probes
CPU     ID                    FUNCTION:NAME
  0  18616         posix_spawn:exec-success 
             0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f  0123456789abcdef
         0: 6d 64 77 6f 72 6b 65 72 00 73 6b 00 00 00 00 00  mdworker.sk.....
        10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        30: 00 00 00 00 70 e5 20 0a 00 00 00 00 01 00 00 00  ....p. .........
        40: 00 00 00 00 00 00 00 00 00 00 00 00 cc 42 1c 0a  .............B..

  0  18610        __mac_execve:exec-success 
             0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f  0123456789abcdef
         0: 67 2b 2b 2d 34 2e 30 00 61 73 6b 00 00 00 00 00  g++-4.0.ask.....
        10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        30: 00 00 00 00 e0 e1 20 0a 00 00 00 00 01 00 00 00  ...... .........
        40: 00 00 00 00 00 00 00 00 00 00 00 00 8c 4d 7b 0b  .............M{.

  0  18610        __mac_execve:exec-success 
             0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f  0123456789abcdef
         0: 69 36 38 36 2d 61 70 70 6c 65 2d 64 61 72 77 69  i686-apple-darwi
        10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        30: 00 00 00 00 e0 e1 20 0a 00 00 00 00 01 00 00 00  ...... .........
        40: 00 00 00 00 00 00 00 00 00 00 00 00 14 8a 7b 0b  ..............{.

  3  18610        __mac_execve:exec-success 
             0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f  0123456789abcdef
         0: 63 6f 6c 6c 65 63 74 32 00 70 70 6c 65 2d 64 61  collect2.pple-da
        10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
        30: 00 00 00 00 f0 e3 20 0a 00 00 00 00 01 00 00 00  ...... .........
        40: 00 00 00 00 00 00 00 00 00 00 00 00 78 70 7b 0b  ............xp{.

т.е. только argv[0] показывается со случайным мусором после него. Кроме того, если argv[0] длиннее 16 символов, оно усекается!

Есть ли способ заставить DTrace делать то, что я хочу в OS X? Или есть какой-то другой способ найти команды и аргументы, вызываемые чем-то в OS X?

Благодарю.

1 ответ

Решение

Snow Leopard поставляется с образцом сценария DTrace, который называется /usr/bin/newproc.d, Он действительно хочет, чтобы вы хотели - однако только глобально. Чтобы ограничить его одним процессом, вы можете попробовать что-то вроде этого:

cp /usr/bin/newproc.d ~/newproc.d

Добавьте новый предикат, изменив следующие строки

19: proc:::exec-success
20: {

в это:

19: proc:::exec-success
20: / ppid == $target /
21: {

Теперь выполните новый скрипт следующим образом:

sudo ~/newproc.d -p <PID>

PID - это идентификатор процесса для наблюдения. Пожалуйста, скажите мне, если это работает для вас. Я только кратко проверил это с bash процесс.

Другие вопросы по тегам