Como encontro quais processos (com args) estão sendo executados no OS X (Leopard) durante um período de tempo?

3

Estou tentando descobrir quais processos um processo específico está executando em uma máquina OS X (incluindo argumentos). Eu não usei o DTrace antes, mas achei que deveria ser trivial. Depois de procurar exemplos, descobri isso, que parece exatamente o que eu quero:

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

Apenas não funciona corretamente. Um dos sites que listou esse comando tinha uma saída de amostra que parecia perfeita, mas quando tento executá-lo no OS X, recebo o seguinte:

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{.

i.e. apenas argv [0] é mostrado com lixo aleatório após ele. Além disso, se argv [0] tiver mais de 16 caracteres, será truncado!

Existe uma maneira de fazer o DTrace fazer o que eu quero no OS X? Ou existe alguma outra maneira de encontrar os comandos e argumentos sendo chamados por algo no OS X?

Obrigado.

    
por Wodin 15.11.2010 / 09:57

1 resposta

5

O Snow Leopard vem com um script de amostra do DTrace chamado /usr/bin/newproc.d . Ele quer que você queira - no entanto, apenas globalmente. Para restringir isso a um único processo, você poderia tentar algo assim:

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

Adicione um novo predicado alterando as seguintes linhas

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

para isso:

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

Agora, execute o novo script assim:

sudo ~/newproc.d -p <PID>

PID é o ID do processo do processo a ser assistido. Por favor, me diga se isso funciona para você. Eu só testei isso brevemente com um processo bash .

    
por 20.11.2010 / 14:20