Z pytania tutaj OP chce wielokrotnie sondować pid procesu za pidof
pomocą skryptu powłoki. Oczywiście jest to nieefektywne, ponieważ nowy proces musi być uruchamiany dla pidof
programu wiele razy na sekundę (nie wiem, że jest to przyczyną skoków procesora w pytaniu, ale wydaje się prawdopodobne).
Zwykle w skrypcie powłoki można obejść ten problem, pracując z jednym programem, który generuje potrzebne dane, stdout
a następnie w razie potrzeby przetwarzając tekst. Chociaż wymaga to jednoczesnego działania większej liczby programów, prawdopodobnie procesor będzie mniej obciążony, ponieważ nowe procesy nie są ciągle tworzone w celu odpytywania.
Tak więc dla powyższego pytania jednym rozwiązaniem może być jakiś program, który wyświetla nazwy i stawki procesów podczas ich tworzenia. Następnie możesz zrobić coś takiego:
pids-names |
grep some_program |
cut -f 2 |
while read pid; do
process-pid "$pid"
done
Problem polega na tym, że rodzi to bardziej fundamentalne pytanie, w jaki sposób można drukować pidy i nazwy procesów podczas ich tworzenia?
Znalazłem program o nazwie ps-watcher
, chociaż problem polega na tym, że jest to tylko perl
skrypt, który wielokrotnie się uruchamia, ps
więc tak naprawdę nie rozwiązuje problemu. Inną opcją jest użycie, auditd
które prawdopodobnie mogłoby działać, gdyby dziennik był przetwarzany bezpośrednio przez tail -f
. Idealne rozwiązanie byłoby prostsze i bardziej przenośne niż to, ale zaakceptuję auditd
rozwiązanie, jeśli jest to najlepsza opcja.
źródło
fork
lub wariantu), a następnie nowy program jest uruchamiany przy użyciu członkaexec
rodziny. Więc prawdopodobnie chcesz się zalogowaćexec*
, a niefork
.dbus
.).Odpowiedzi:
Odpowiedź specyficzna dla systemu Linux:
perf-tools zawiera execsnoop , który właśnie to robi. Wykorzystuje różne funkcje specyficzne dla systemu Linux, takie jak ftrace. W Debianie jest w pakiecie niestabilnym perf-tools .
Przykład mojego działania
man cat
w innym terminalu:Wątpię, czy jest na to przenośny sposób.
źródło
Nie Right Way TM robi to w dużej mierze zależy, jaki system i jądra są faktycznie działa na. DTrace powinien działać na systemach Solaris, Free / NetBSD i Linux.
W przypadku Linuksa możesz użyć albo ftrace (który musi być włączony w czasie kompilacji - to zwykle jest), albo proc procesów przez netlink - zobacz SO odpowiedź na problem, aby uzyskać więcej szczegółów (i pamiętaj, aby zagłosować, wynik ~ 30 vs. 0 dla zaakceptowanej odpowiedzi wygląda śmiesznie). Znacznik biednego człowieka może być prawdopodobnie zaimplementowany przy użyciu
strace -eexec,fork
(choć z nieracjonalnym kosztem ogólnym).źródło