Как получить идентификатор очень короткого дочернего процесса, если родитель известен?

Я ищу способ получить PID короткого дочернего процесса в Linux. Процесс мгновен с точки зрения человека. Я знаю родительский процесс, который породит дочерний процесс.

Есть ли способ регистрировать информацию обо всех процессах, созданных определенным родительским процессом?

Я не ищу способ ретроактивно определить PID ребенка, но способ зарегистрировать его, как только это произойдет.

4 Solutions collect form web for “Как получить идентификатор очень короткого дочернего процесса, если родитель известен?”

Вы можете использовать систему аудита:

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

приведет к генерации записей аудита каждый раз, когда дочерний элемент $pid выполняет команду. audit.log будет иметь такие вещи, как:

 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 

Где вы можете найти pid среди других вещей.

Если вас интересуют процессы, которые не обязательно что-то выполняют, вы можете добавить правила аудита для системных вызовов fork и clone .

[этот ответ исходил от этого ams aswer ]

Если дочерний процесс является отдельным исполняемым файлом (позволяет его вызвать foo ), вы можете попробовать использовать оболочку оболочки.

Переименуйте оригинальный исполняемый файл:

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

Создайте обертку как foo :

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

сделать его исполняемым:

 chmod +x foo 

В следующий раз, когда программа будет запущена, вы получите pid в \tmp\foo.pid .

Если ваша ОС (не указано в o / p) не поддерживает трассировку процесса, подумайте о замене дочернего образа оболочкой, предполагая, что новый процесс загружает новое изображение.

Методы Shell

Когда вы запускаете команду в оболочке, вы можете узнать PID последнего процесса, который был запущен в фоновом режиме, используя специальную переменную $! в оболочке Bash.

Например:

 $ sleep 5 & $ echo $! 8648 

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

 $ sleep 5 & [1] 8648 

Другим методом было бы использовать pgrep -P <PPID> . Например:

 # PID of bash shell $ echo $$ 8376 # run fake job $ sleep 120 & [1] 8891 # pgrep PPID $ pgrep -P 8376 8891 

Valgrind

Существует еще один способ, если вы можете ввести следующее перед выполнением программы, в которой вы пытаетесь получить дочерние PID:

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

Например:

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

17733 – это идентификатор PPID, а PID 17734 – дочерний PID, который вызывается ( ls ).

  • Я хочу убить все процессы, которые являются результатом следующей команды
  • Каталог в / proc, который не является процессом, но начинается с номера?
  • Как идентифицировать и убивать запущенные процессы, которые запускаются, выходят, а затем снова запускаются?
  • Как определить процесс, который не имеет pid?
  • Невозможно выполнить KDE Dolphin из веб-скрипта PHP, но работает для всех других программ X
  • Элегантно получить список процессов потомков
  • Прочитайте другую память процессов, используя ptrace () в C / CPP
  • обнаруживать процесс питания процессора без: top, htop, ps?
  • Сценарий Bash, чтобы найти и убить процесс с определенными аргументами?
  • Фоновый процесс сбора информации о окне с некоторой задержкой, как управлять им?
  • Что это за таинственный процесс под названием «proc» в моем списке процессов
  • Linux и Unix - лучшая ОС в мире.