От вопроса здесь , ОП хочет повторно опрашивать идентификатор процесса с использованием 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
решение, если это лучший вариант.
источник
fork
или варианта), а затем новая программа запускается с использованием членаexec
семейства. Таким образом, вы, вероятно, хотите войтиexec*
, а неfork
.dbus
).Ответы:
Ответ для Linux:
perf-tools содержит execsnoop, который делает именно это. Он использует различные специфичные для Linux функции, такие как ftrace. На Debian он находится в нестабильном пакете perf-tools .
Пример моего запуска
man cat
в другом терминале:Я сомневаюсь, что есть портативный способ сделать это.
источник
Там, где Right Right TM делает это, сильно зависит от того, на какой системе и в каком ядре вы работаете. DTrace должен работать на Solaris, Free / NetBSD и Linux.
В частности, для Linux вы можете использовать либо ftrace (который должен быть включен во время компиляции - обычно это так), либо события proc по netlink - см. Ответ SO на проблему для получения более подробной информации (и не забудьте проголосовать, оценка ~ 30 против 0 за принятый ответ выглядит забавно). Трассировку бедного человека, вероятно, можно реализовать с помощью
strace -eexec,fork
(хотя и с необоснованными накладными расходами).источник