Друкуйте підписи та назви процесів під час їх створення


10

Від питання тут , ОП хоче повторно опитувати ідентифікатор процесу з використанням pidofв сценарії оболонки. Звичайно, це неефективно, оскільки новий процес потрібно починати для pidofпрограми кілька разів на секунду (я не знаю, що це причина сплеску процесора у питанні, але це здається вірогідним).

Зазвичай шлях подібного до сценарію оболонки - це робота з єдиною програмою, яка виводить потрібні вам дані, stdoutа потім виконує деяку обробку тексту, якщо це необхідно. Хоча це передбачає, що більше програм одночасно запускається, це, ймовірно, буде менш інтенсивним процесором, оскільки нові процеси не створюються постійно для цілей опитування.

Отже, для вищезазначеного питання, одним із варіантів рішення може бути наявність якоїсь програми, яка виводить імена та підручники процесів під час їх створення. Тоді ви можете зробити щось на кшталт:

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

Проблема в цьому полягає в тому, що вона ставить більш фундаментальне питання, як можна друкувати ідентифікатори підрозділів та імена процесів під час їх створення?

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


1
Цікавою стороною зауваження є те, що спочатку pid створюється як копія процесу створення ( forkабо варіанту), потім нова програма запускається з використанням члена execсім’ї. Отже, ви, мабуть, хочете ввійти в протокол exec*, а не fork.
дероберт

2
Єдиний портативний ефективний спосіб, про який я знаю, - це використовувати звичайний облік процесів Unix, який запише запис після завершення процесу. Якщо ви хочете вловлювати процеси під час їх створення або виконання, вам, ймовірно, потрібні специфічні для системи речі, такі як Linux auditd, systemtap або dtrace.
Марк Плотнік

Отже, для вищезазначеного питання, одним із варіантів рішення може бути наявність якоїсь програми, яка виводить імена та підручники процесів під час їх створення. - Як вони створені? Звучить те, що ви думаєте, як спостерігач (саме так вони називають їх у світі веб-браузерів). Мені цікаво, чи був би Python підходящим для того, щоб виконувати роль "охоронця дверей"? Факти полягають у тому, що Python може дуже глибоко копатися у внутрішній роботі системи (наприклад dbus).
синтаксичний помилок

1
@syntaxerror DBus далеко не внутрішня робота системи в цьому випадку - це насправді приблизно на два рівні вище того, що тут обговорюється.
петерф

Гаразд, в OSI lingo рівень, що обговорюється тут, може бути ще нижчим, ніж у 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 

Я сумніваюся, що є портативний спосіб зробити це.


2

Там Right Way TM від цього дуже залежить від того, на якій системі та ядрі ви працюєте. DTrace повинен працювати на Solaris, Free / NetBSD та Linux.

Спеціально для Linux ви можете використовувати ftrace (який повинен бути включений під час компіляції - зазвичай це є) або proc події через netlink - детальну інформацію див. У відповіді на цю проблему (і не забудьте проголосувати за неї, оцінка ~ 30 проти 0 для прийнятої відповіді виглядає смішно). Мабуть, бідний чоловік може бути реалізований за допомогою strace -eexec,fork(хоча з необгрунтованими накладними витратами).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.