Как получить идентификатор очень короткого дочернего процесса, если родитель известен?
Я ищу способ получить PID короткого дочернего процесса в Linux. Процесс мгновен с точки зрения человека. Я знаю родительский процесс, который породит дочерний процесс.
Есть ли способ регистрировать информацию обо всех процессах, созданных определенным родительским процессом?
- Безмоментный запуск задачи в фоновом режиме
- переход из режима пользователя в режим ядра
- В чем разница между выходом из процесса с помощью Ctrl + C и выдачей команды kill -9?
- Длительный R-скрипт автоматически убивается
- Получить команду PID и отправить в другой
Я не ищу способ ретроактивно определить PID ребенка, но способ зарегистрировать его, как только это произойдет.
- Каков результат команды «du» во время длинной копии?
- Тупик в кронабе между cron и его дочерними несуществующими процессами
- Bash unsets * _PID переменная, прежде чем я могу ждать на coproc
- Как получить PID подпроцесса через родительский процесс в сценарии оболочки bash?
- Идентификатор родителя-сиротца не равен 1, когда родительский процесс выполняется с терминала GNOME
- Определить процесс
- Все ли процессы Linux записывают EOF в stdout, когда они завершают / заканчивают завершение?
- Почему bash показывает «Terminated» после убийства процесса?
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
).