Supposons que j'exécute une commande dans une session Shell, par exemple bash -c 'apt-get update && apt-get upgrade'
. 5 minutes plus tard, je décide d'aller prendre un en-cas à l'extérieur et réalise que j'ai oublié de ajouter un mécanisme de notification pour savoir si la sortie a été un succès ou un échec.
Eh bien, qu'est-ce que je fais maintenant? Si seulement je pouvais demander à un autre terminal le statut de sortie de cette autre commande (ou plus précisément de ce PID), je pourrais peut-être tout de même afficher une sorte de fenêtre contextuelle. La question est donc la suivante: comment interroger le statut de sortie d'un processus en cours depuis un autre terminal?
En d'autres termes,
DONNÉ que j'ai un processus en cours d'exécution sur le terminal A ET que son PID est connu
QUAND j'exécute une commande dans le terminal B
ALORS, je devrais pouvoir savoir si le processus du terminal A se termine avec un état de sortie 0 ou un état de sortie> 1.
Utilisez strace
comme suit:
Sudo strace -e trace=none -e signal=none -q -p $PID
Ici, ni les appels système ni les signaux n’ont d’intérêt, nous disons donc à strace
de les ignorer avec les expressions -e
et de supprimer un message d’état avec -q
. strace
se rattache au processus avec le PID $PID
, attend sa sortie normale et affiche son statut de sortie de la manière suivante:
+++ exited with 0 +++
Une expression if
simple pour appeler tout type de notification pourrait être:
if Sudo strace -e trace=none -e signal=none -q -p $PID |& grep -q ' 0 '; then
echo yeah
else
echo nope
fi
# in terminal 1
$ (echo $BASHPID;sleep 10;true)
8807
# in terminal 2
$ if Sudo strace -e{trace,signal}=none -qp8807|&grep -q ' 0 ';then echo yeah;else echo nope;fi
yeah
# in terminal 1
$ (echo $BASHPID;sleep 10;false)
12285
# in terminal 2
$ if Sudo strace -e{trace,signal}=none -qp12285|&grep -q ' 0 ';then echo yeah;else echo nope;fi
nope
La majeure partie du crédit revient à cette réponse sur U & L , laissez un vote positif si cela vous semble utile.