Определение всех процессов, запущенных с данным исполняемым файлом в Linux - PullRequest
0 голосов
/ 27 мая 2020

Мне нужно собрать \ зарегистрировать все командные строки, которые использовались для запуска процесса на моей машине во время выполнения Perl скрипта, который оказался скриптом автоматизации тестирования. Этот Perl сценарий запускает рассматриваемый исполняемый файл (MySQL) несколько раз с различными командными строками, и я хотел бы проверить все командные строки этих вызовов. Как правильно это сделать? Одна из возможностей, которую я вижу, - это запустить что-то вроде "ps -aux | grep mysqld | grep -v grep" в al oop в сценарии оболочки и записать результаты в файл, но тогда мне придется выполнить некоторую пост-обработку этого и удалите дубликаты et c, и я мог бы пропустить некоторые командные строки процесса из-за проблем с синхронизацией. Есть ли лучший способ добиться этого.

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Вы можете использовать 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>, поэтому тогда Надеюсь, тогда у вас будет достаточно информации, чтобы восстановить дерево процессов и решить, какие процессы вас интересуют.

0 голосов
/ 27 мая 2020

Обработка вывода ps всегда может пропускать некоторые процессы. Он будет захватывать только те, которые в настоящее время существуют. Лучшим способом было бы изменить сценарий Perl так, чтобы каждая команда регистрировалась до или после ее выполнения.

Если это не вариант, вы можете получить дочерние идентификаторы сценария perl, запустив:

pgrep -P $pid -a

-a дает полную команду процесса. $pid - идентификатор сценария perl. Затем обработайте только эти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...