Печать pids и названий процессов по мере их создания

10

От вопроса здесь , ОП хочет повторно опрашивать идентификатор процесса с использованием pidofв сценарии оболочки. Конечно, это неэффективно, так как новый процесс должен запускаться для pidofпрограммы несколько раз в секунду (я не знаю, что это является причиной скачков ЦП в вопросе, но это кажется вероятным).

Обычно обходной путь в сценарии оболочки заключается в работе с одной программой, которая выводит необходимые данные, stdoutа затем, при необходимости, выполняет некоторую обработку текста. В то время как для этого требуется одновременное выполнение большего количества программ, вероятно, он будет менее загруженным ЦП, поскольку новые процессы не создаются постоянно для целей опроса.

Таким образом, для вышеупомянутого вопроса одним из решений может быть наличие некоторой программы, которая выводит имена и идентификаторы процессов по мере их создания. Тогда вы можете сделать что-то вроде:

pids-names |
  grep some_program |
  cut -f 2 |
  while read pid; do
    process-pid "$pid"
  done

Проблема в том, что возникает более фундаментальный вопрос: как можно печатать pids и имена процессов при их создании?

Я нашел программу под названием ps-watcher, хотя проблема в том, что это просто perlскрипт, который многократно запускается, psпоэтому он не решает проблему. Другой вариант - использовать, auditdкоторый, вероятно, мог бы работать, если бы журнал обрабатывался напрямую через tail -f. Идеальное решение было бы проще и более портативным, чем это, хотя я приму auditdрешение, если это лучший вариант.

Graeme
источник
1
Интересно отметить, что pid сначала создается как копия процесса создания ( forkили варианта), а затем новая программа запускается с использованием члена execсемейства. Таким образом, вы, вероятно, хотите войти exec*, а не fork.
Дероберт
2
Единственный эффективный портативный способ, который я знаю, - это использование обычного учета процессов Unix, который будет записывать запись после завершения процесса. Если вы хотите отлавливать процессы по мере их создания или выполнения, вам, вероятно, понадобятся специфичные для системы вещи, такие как Linux audd, systemtap или dtrace.
Марк Плотник
Таким образом, для вышеупомянутого вопроса, одним из решений может быть наличие некоторой программы, которая выводит имена и идентификаторы процессов по мере их создания. - Как они созданы? Похоже, вы думаете о наблюдателе (это то, что они называют в мире веб-браузера). Мне интересно, подойдет ли Python в качестве «охранника дверей»? Факты в том, что Python может очень глубоко копаться во внутренней работе системы (например dbus).
синтаксическая ошибка
1
@syntaxerror DBus в данном случае далек от внутренней работы системы - на самом деле он примерно на два уровня выше того, что обсуждается здесь.
Петер
Хорошо, в OSI жаргон на уровне обсуждается здесь может быть еще ниже , чем у DBus. Я признаю, что я не задумывался о том, находятся ли оба на одном уровне или нет.
синтаксическая ошибка

Ответы:

6

Ответ для Linux:

perf-tools содержит execsnoop, который делает именно это. Он использует различные специфичные для Linux функции, такие как ftrace. На Debian он находится в нестабильном пакете perf-tools .

Пример моего запуска man catв другом терминале:

root@Zia:~# execsnoop 
TIME        PID   PPID ARGS
17:24:26  14189  12878 man cat 
17:24:26  14196  14189 tbl 
17:24:26  14195  14189 preconv -e UTF-8 
17:24:26  14199  14189 /bin/sh /usr/bin/nroff -mandoc -Tutf8 
17:24:26  14200  14189 less 
17:24:26  14201  14199 locale charmap 
17:24:26  14202  14199 groff -mtty-char -Tutf8 -mandoc 
17:24:26  14203  14202 troff -mtty-char -mandoc -Tutf8 
17:24:26  14204  14202 grotty 

Я сомневаюсь, что есть портативный способ сделать это.

derobert
источник
2

Там, где Right Right TM делает это, сильно зависит от того, на какой системе и в каком ядре вы работаете. DTrace должен работать на Solaris, Free / NetBSD и Linux.

В частности, для Linux вы можете использовать либо ftrace (который должен быть включен во время компиляции - обычно это так), либо события proc по netlink - см. Ответ SO на проблему для получения более подробной информации (и не забудьте проголосовать, оценка ~ 30 против 0 за принятый ответ выглядит забавно). Трассировку бедного человека, вероятно, можно реализовать с помощью strace -eexec,fork(хотя и с необоснованными накладными расходами).

peterph
источник