Como obter o id de um processo filho muito pequeno se o pai é conhecido?

3

Estou procurando uma maneira de obter o PID de um processo filho curto no Linux. O processo é instantâneo de uma perspectiva humana. Eu conheço o processo pai que gerará o processo filho.

Existe uma maneira de registrar informações sobre todos os processos criados por um processo pai específico?

Eu não estou procurando uma maneira de descobrir retroativamente o PID da criança, mas uma maneira de registrá-lo uma vez que isso acontece.

    
por TheMeaningfulEngineer 15.07.2013 / 15:11

4 respostas

2

Você pode usar o sistema de auditoria:

sudo auditctl -a exit,always -S execve -F ppid="$pid"

faria com que as entradas de auditoria fossem geradas sempre que um filho de $pid executasse um comando. audit.log teria coisas como:

type=SYSCALL msg=audit(1373986729.977:377): arch=c000003e syscall=59 success=yes exit=0 a0=7ff000e4b188 a1=7ff000e4b1b0 a2=7fff928d47e8 a3=7fff928caac0 items=2 ppid=7502 pid=691 auid=10031 uid=10031 gid=10031 euid=10031 suid=10031 fsuid=10031 egid=10031 sgid=10031 fsgid=10031 ses=1 tty=pts5 comm="echo" exe="/bin/echo" key=(null)
type=EXECVE msg=audit(1373986729.977:377): argc=2 a0="/bin/echo" a1="test"
type=CWD msg=audit(1373986729.977:377):  cwd="/tmp"
type=PATH msg=audit(1373986729.977:377): item=0 name="/bin/echo" inode=131750 dev=fe:00 mode=0100755 ouid=0 ogid=0 rdev=00:00

Onde você pode encontrar o pid entre outras coisas.

Se você estiver interessado em processos que não executam necessariamente algo, adicione regras de auditoria para as chamadas do sistema fork e clone .

    
por 16.07.2013 / 17:03
2

[esta resposta é inspirada por ass aswer ]

Se o processo filho for um executável distinto (vamos chamá-lo de foo ), você pode tentar usar um wrapper de shell.

Renomeie o executável original:

$ cd \path\to\foo\
$ mv foo foo.moved

Crie um wrapper como foo :

#!/bin/sh
\path\to\foo\foo.moved "$@" &
FOO_PID=$!
echo $FOO_PID >\tmp\foo.pid

torne-o executável:

chmod +x foo

Na próxima vez que o programa for executado, você receberá o pid em \tmp\foo.pid .

    
por 15.07.2013 / 23:43
0

Se o seu sistema operacional (não especificado em o / p) não suportar o rastreamento do processo, considere a substituição da imagem filha por um wrapper, supondo que o novo processo carregue uma nova imagem.

    
por 15.07.2013 / 16:46
0

Métodos da shell

Quando você executa um comando em um shell, pode descobrir o PID do último processo que foi executado em segundo plano usando a variável especial $! em um shell Bash.

Por exemplo:

$ sleep 5 &
$ echo $!
8648

Além disso, quando você utiliza um processo em segundo plano, o PID desse processo é retornado pelo console da seguinte forma:

$ sleep 5 &
[1] 8648    

Outro método seria usar pgrep -P <PPID> . Por exemplo:

# PID of bash shell
$ echo $$
8376

# run fake job
$ sleep 120 &
[1] 8891

# pgrep PPID
$ pgrep -P 8376
8891

valgrind

Existe outro método se você puder injetar o seguinte na frente da execução do programa para o qual você está tentando obter os PIDs filhos:

$ valgrind --trace-children=yes <cmd>

Por exemplo:

# sample.bash
#/bin/bash

ls

$ valgrind --trace-children=yes ./sample.bash
...
==17734==      possibly lost: 0 bytes in 0 blocks
==17734==    still reachable: 33,606 bytes in 95 blocks
==17734==         suppressed: 0 bytes in 0 blocks
==17734== Rerun with --leak-check=full to see details of leaked memory
==17734== 
==17734== For counts of detected and suppressed errors, rerun with: -v
==17734== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6)
==17733== 
==17733== HEAP SUMMARY:
==17733==     in use at exit: 36,409 bytes in 879 blocks
...

O 17733 é o PPID e o PID 17734 é o PID filho que é invocado ( ls ).

    
por 15.07.2013 / 22:06