Un approccio, certamente pesante, è usare strace
:
$ strace -e trace=none -e signal=none -p 12345
osserverà il processo con PID 12345, non intercettando nessuna chiamata di sistema (primo -e
) e nessun segnale (secondo -e
). Una volta terminato il processo in modo regolare, verrà stampato il valore di uscita.
Se il processo viene terminato da un segnale, strace esce silenziosamente (se eseguito con le opzioni fornite sopra). Puoi usare ad es. -e signal=kill
per cambiare questo comportamento. Nota, tuttavia, che -e signal=all
(o, equivalentemente, omettendo il -e signal
opzione) potrebbe produrre una grande quantità di output se i segnali vengono ricevuti e gestiti dal programma.
-
Concatenamento dell'esecuzione di "notify"
$ process; notify $? &
Si noti che se il processo terminerà in modo imprevisto
notify
non verrà eseguito -
Impostare trap
Il processo è segnalato da segnali di significato diverso e può reagire in modo appropriato
#!/bin/bash process function finish { notify $? } trap finish EXIT
Non ti è chiaro quale notifica hai in mente. In sostanza può essere qualsiasi cosa che suoni un "campanello", ovviamente. Uno per molti es. notify-send
da libnotify
libreria.
$ process; notify-send "process finished with status $?" &
Bash fa questo per te. Ti avviserà al termine del processo restituendoti il controllo e memorizzerà lo stato di uscita nella variabile speciale $?
. Sembra più o meno così:
someprocess
echo $?
Consulta il manuale di bash sui parametri speciali per maggiori informazioni.
Ma presumo che tu voglia fare altro lavoro mentre aspetti. In bash puoi farlo in questo modo:
someprocess &
otherwork
wait %+
echo $?
someprocess &
avvierà il processo in background. Ciò significa che il controllo tornerà immediatamente e potrai svolgere altro lavoro. Un processo avviato in background è chiamato lavoro in bash. wait
attenderà il completamento del lavoro specificato e quindi restituirà lo stato di uscita di quel lavoro. I lavori sono referenziati da %n
. %+
si riferisce all'ultimo lavoro iniziato. Consulta il manuale di bash sul controllo dei processi per maggiori informazioni.
Se hai davvero bisogno del PID puoi anche farlo in questo modo:
someprocess &
PID=$!
otherwork
wait $PID
echo $?
$!
è una variabile speciale contenente il PID dell'ultimo processo in background avviato.