Stampa pid e nomi dei processi mentre vengono creati


10

Dalla domanda qui , l'OP vuole eseguire ripetutamente il polling del pid di un processo usando pidofin uno script di shell. Naturalmente questo è inefficiente in quanto un nuovo processo deve essere avviato per il pidofprogramma più volte al secondo (non so che questa è la causa dei picchi di CPU nella domanda, ma sembra probabile).

Di solito il modo per aggirare questo genere di cose in uno script di shell è lavorare con un singolo programma che emetta i dati necessari stdoute quindi eseguire un po 'di elaborazione del testo, se necessario. Sebbene ciò comporti l'esecuzione simultanea di più programmi, è probabile che richieda meno CPU, poiché non vengono continuamente creati nuovi processi a scopo di polling.

Quindi, per la domanda di cui sopra, una soluzione potrebbe essere quella di avere qualche programma che emetta i nomi e i pid dei processi mentre vengono creati. Quindi potresti fare qualcosa del tipo:

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

Il problema è che solleva una domanda più fondamentale, come possono essere stampati pid e nomi dei processi mentre vengono creati?

Ho trovato un programma chiamato ps-watcher, anche se il problema è che si tratta solo di uno perlscript che viene eseguito ripetutamente, psquindi non risolve davvero il problema. Un'altra opzione è quella auditdche potrebbe funzionare se il registro è stato elaborato direttamente tramite tail -f. Una soluzione ideale sarebbe più semplice e più portatile di questa, sebbene accetterò una auditdsoluzione se è l'opzione migliore.


1
Una nota a margine interessante è che il pid viene prima creato come una copia del processo di creazione ( forko variante), quindi il nuovo programma viene avviato utilizzando un membro della execfamiglia. Quindi probabilmente vuoi registrare il exec*, non il fork.
derobert,

2
L'unico modo portatile ed efficiente di cui sono a conoscenza è di utilizzare la normale contabilità dei processi Unix, che scriverà un record dopo la chiusura di un processo. Se vuoi catturare i processi mentre vengono creati o eseguiti, probabilmente hai bisogno di cose specifiche del sistema come auditd Linux, systemtap o dtrace.
Mark Plotnick,

Quindi, per la domanda di cui sopra, una soluzione potrebbe essere quella di avere qualche programma che emetta i nomi e i pid dei processi mentre vengono creati. - Come sono creati? Sembra che quello che stai pensando sia un osservatore (questo è quello che li chiamano nel mondo dei browser Web). Mi chiedo se Python sarebbe adatto ad agire come "guardiano della porta"? I fatti sono che Python può scavare molto a fondo nei meccanismi interni del sistema (ad es dbus.).
syntaxerror,

1
@syntaxerror DBus è ben lungi dall'essere interiore del sistema in questo caso - in realtà si tratta di due livelli sopra quello di cui si discute qui.
peterph,

OK, nel gergo OSI il livello discusso qui potrebbe essere ancora inferiore a quello di dbus. Devo ammettere che non avevo riflettuto a fondo se entrambi fossero sullo stesso piano o meno.
syntaxerror,

Risposte:


6

Risposta specifica per Linux:

perf-tools contiene un execsnoop che fa esattamente questo. Utilizza varie funzionalità specifiche di Linux come ftrace. Su Debian, è nel pacchetto perf-tools-unstable .

Esempio di esecuzione man catdi un altro terminale:

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 

Dubito che ci sia un modo portatile per farlo.


2

There Right Way TM di farlo dipende fortemente dal sistema e dal kernel su cui si sta effettivamente eseguendo. DTrace dovrebbe funzionare su Solaris, Free / NetBSD e Linux.

Per Linux in particolare, puoi usare ftrace (che deve essere abilitato in fase di compilazione - di solito lo è) o proc eventi su netlink - vedi la risposta SO al problema per maggiori dettagli (e ricorda di votare, il punteggio ~ 30 vs. 0 per la risposta accettata sembra divertente). Il tracciante del povero uomo potrebbe probabilmente essere implementato usando strace -eexec,fork(anche se con un sovraccarico irragionevole).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.