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

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

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

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

  • Скрипт всегда запускает два экземпляра
  • Исправлена ​​ошибка «firefox уже запущена» в Linux
  • Запустите HTTP-сервер python, который может быть остановлен кем-либо еще
  • Являются ли зомби-процессы чем-то, о чем я должен беспокоиться?
  • Системный вызов сна и его параметр времени
  • Предотвратите попытки пользователей убивать процессы, которые у них есть.
  • Лучший способ убить процессы в списке
  • / usr / bin / awk: слишком длинный список аргументов
  • 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 ).

    Linux и Unix - лучшая ОС в мире.