Wydrukuj pid i nazwy procesów podczas ich tworzenia

10

Z pytania tutaj OP chce wielokrotnie sondować pid procesu za pidofpomocą skryptu powłoki. Oczywiście jest to nieefektywne, ponieważ nowy proces musi być uruchamiany dla pidofprogramu 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, stdouta 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 perlskrypt, który wielokrotnie się uruchamia, pswięc tak naprawdę nie rozwiązuje problemu. Inną opcją jest użycie, auditdktó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ę auditdrozwiązanie, jeśli jest to najlepsza opcja.

Graeme
źródło
1
Ciekawą uwagą dodatkową jest to, że pid jest najpierw tworzony jako kopia procesu tworzenia ( forklub wariantu), a następnie nowy program jest uruchamiany przy użyciu członka execrodziny. Więc prawdopodobnie chcesz się zalogować exec*, a nie fork.
derobert
2
Jedynym przenośnym, wydajnym sposobem, o jakim jestem świadomy, jest stosowanie zwykłej księgowości procesów uniksowych, która zapisuje rekord po zakończeniu procesu. Jeśli chcesz przechwytywać procesy podczas ich tworzenia lub wykonywania, prawdopodobnie potrzebujesz rzeczy specyficznych dla systemu, takich jak Linux, audyt, systemtap lub dtrace.
Mark Plotnick
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. - Jak są tworzone? Wygląda na to, że masz na myśli obserwatora (tak nazywają ich w świecie przeglądarek internetowych). Zastanawiam się, czy Python byłby odpowiedni do działania jako „strażnik drzwi”? Fakty są takie, że Python może bardzo głęboko zagłębić się w wewnętrzne funkcjonowanie systemu (np dbus.).
składniaerror
1
@syntaxerror DBus jest daleki od wewnętrznej pracy systemu w tym przypadku - w rzeczywistości jest o około dwa poziomy powyżej, co jest tutaj omawiane.
peterph
OK, w języku OSI omawiany tutaj poziom może być jeszcze niższy niż w przypadku dbus. Przyznaję, że nie zastanawiałem się dokładnie, czy oba są na tym samym poziomie, czy nie.
składniaerror

Odpowiedzi:

6

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 catw innym terminalu:

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 

Wątpię, czy jest na to przenośny sposób.

derobert
źródło
2

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).

Peter
źródło