Вы можете использовать strace
для регистрации вызовов execve
.
$ strace -f -o strace.out -e execve perl -e 'system("echo hello")'
hello
$ egrep ' = 0$' strace.out
11232 execve("/usr/bin/perl", ["perl", "-e", "system(\"echo hello\")"], 0x7ffc6d8e3478 /* 55 vars */) = 0
11233 execve("/bin/echo", ["echo", "hello"], 0x55f388200cf0 /* 55 vars */) = 0
Обратите внимание, что strace.out
также покажет неудачные execs (где execve
вернул -1), следовательно, egrep
, чтобы найти успешные. Успешный вызов execve
не возвращается, но strace
записывает его, как если бы он возвратил 0.
Имейте в виду, что это относительно дорогое решение, потому что необходимо включить опцию -f
(см. forks), поскольку perl будет выполнять вызов exe c из разветвленных подпроцессов. Это применяется рекурсивно, поэтому это означает, что ваш исполняемый файл MySQL сам будет запускаться через strace. Но для одноразовой диагностики c это может быть приемлемо.
Из-за необходимости использования рекурсии любые вызовы exe c, выполняемые из вашего MySQL исполняемого файла, также будут отображаться в strace.out
, и вам придется их отфильтровать. Но PID отображается для всех вызовов, и если вы должны регистрировать также любые вызовы fork
или clone
(т.е. strace -e execve,fork,clone
), вы увидите как родительский, так и дочерний PID в форме <parent_pid> clone(......) = <child_pid>
, поэтому тогда Надеюсь, тогда у вас будет достаточно информации, чтобы восстановить дерево процессов и решить, какие процессы вас интересуют.