C'è un modo per ascoltare il processo?


9

Voglio sapere se esiste un modo per ascoltare un processo in Linux e unix: quando termina e qual è il codice di uscita del processo (script).

Non voglio scrivere uno script che verrà eseguito Xsecondi e controllare ps -ef | grep PIDse il processo è ancora attivo. Voglio sapere se esiste un modo in cui il processo mi avviserà quando è terminato e qual è stato il suo codice di uscita.

Risposte:


3

Bash fa questo per te. Ti avviserà quando il processo termina restituendoti il ​​controllo e memorizzerà lo stato di uscita nella variabile speciale $?. Sembra più o meno così:

someprocess
echo $?

Vedi il manuale di bash sui parametri speciali per maggiori informazioni.

Ma suppongo che tu voglia fare altri lavori mentre aspetti. In bash puoi farlo in questo modo:

someprocess &
otherwork
wait %+
echo $?

someprocess &inizierà il processo in background. Ciò significa che il controllo tornerà immediatamente e puoi fare altri lavori. Un processo avviato in background viene chiamato lavoro in bash. waitattenderà il completamento del lavoro dato e quindi restituirà lo stato di uscita di quel lavoro. I lavori sono indicati da %n. %+si riferisce all'ultimo lavoro avviato. Vedere il manuale di bash sul controllo del lavoro per ulteriori informazioni.

Se hai davvero bisogno del PID puoi farlo anche in questo modo:

someprocess &
PID=$!
otherwork
wait $PID
echo $?

$! è una variabile speciale contenente il PID dell'ultimo processo in background avviato.


E come waitfunziona? Quanta CPU normalmente impiegherà dal sistema?
Nir il

1
Non so come funzioni esattamente bash wait. So che non ci vuole una notevole quantità di risorse di sistema. Puoi consultare il codice sorgente qui: git.savannah.gnu.org/cgit/bash.git/tree/builtins/wait.def
lesmana

6

Un approccio, certamente pesante, è l'uso di strace:

$ strace -e trace=none -e signal=none -p 12345

seguirà il processo con PID 12345, intercettando nessuna chiamata di sistema (prima -e) e nessun segnale (seconda -e). Una volta che il processo termina in modo regolare, verrà stampato il valore di uscita.

Se il processo termina con un segnale, lo strace esce silenziosamente (quando eseguito con le opzioni sopra indicate). È possibile utilizzare ad esempio -e signal=killper modificare questo comportamento. Si noti, tuttavia, che -e signal=all(o, equivalentemente, omettere l' -e signalopzione) potrebbe produrre una grande quantità di output se i segnali vengono ricevuti e gestiti dal programma.


4
  1. Concatenare l'esecuzione di "notifica"

    $ process; notify $? &

    Si noti che se il processo verrà chiuso in modo imprevisto notifynon verrà eseguito

  2. Preparare trappole

    Il processo è segnalato da segnali di significato diverso e può reagire in modo appropriato

    #!/bin/bash
    
    process
    
    function finish {
        notify $?
    }
    trap finish EXIT
    

Non hai chiaro quale notifica hai in mente. In sostanza, naturalmente, può essere qualsiasi cosa suoni una "campana". Uno per molti, ad es. notify-senddalla libnotifybiblioteca.

$ process; notify-send "process finished with status $?" &


1

Con ptrace()puoi collegare un tracciante a un processo (o eseguirne uno nuovo), impostare un hook con PTRACE_O_TRACEEXIT(linux> = 2.5.60) e dormire fino all'uscita del processo, quindi PTRACE_GETEVENTMSGottenere lo stato di uscita.

Qui un'implementazione di esempio denominata stopper , l'ho verificato solo con l' attachopzione e sono state necessarie alcune modifiche per farlo funzionare (eventualmente, inserirò il codice da qualche parte).

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.