Une approche - certes lourde - consiste à utiliser strace
:
$ strace -e trace=none -e signal=none -p 12345
surveillera le processus avec le PID 12345, n'interceptant aucun appel système (premier -e
) et aucun signal (deuxième -e
). Une fois le processus terminé de manière régulière, la valeur de sortie sera imprimée.
Si le processus se termine par un signal, strace se termine silencieusement (lorsqu'il est exécuté avec les options indiquées ci-dessus). Vous pouvez utiliser par ex. -e signal=kill
pour changer ce comportement. Notez cependant que -e signal=all
(ou, de manière équivalente, en omettant le -e signal
option) peut produire une grande quantité de sortie si les signaux sont reçus et gérés par le programme.
-
Enchaîner l'exécution de "notify"
$ process; notify $? &
Notez que si le processus se termine de manière inattendue
notify
ne sera pas exécuté -
Mise en place de pièges
Le processus est signalé par des signaux d'une signification différente et peut réagir de manière appropriée
#!/bin/bash process function finish { notify $? } trap finish EXIT
Vous ne savez pas quelle notification vous avez en tête. Essentiellement, il peut s'agir de tout ce qui sonne une "cloche" bien sûr. Un pour plusieurs, par exemple. notify-send
à partir de libnotify
bibliothèque.
$ process; notify-send "process finished with status $?" &
Bash le fait pour vous. Il vous avertira lorsque le processus se termine en vous redonnant le contrôle et il stockera le statut de sortie dans la variable spéciale $?
. Il ressemble à peu près à ceci :
someprocess
echo $?
Voir le manuel bash sur les paramètres spéciaux pour plus d'informations.
Mais je suppose que vous voulez faire d'autres travaux en attendant. En bash, vous pouvez le faire comme ceci :
someprocess &
otherwork
wait %+
echo $?
someprocess &
lancera le processus en arrière-plan. Cela signifie que le contrôle reviendra immédiatement et que vous pourrez faire d'autres travaux. Un processus démarré en arrière-plan est appelé un travail dans bash. wait
attendra que la tâche donnée se termine, puis renverra l'état de sortie de cette tâche. Les travaux sont référencés par %n
. %+
fait référence à la dernière tâche démarrée. Consultez le manuel bash sur le contrôle des tâches pour plus d'informations.
Si vous avez vraiment besoin du PID, vous pouvez aussi le faire comme ceci :
someprocess &
PID=$!
otherwork
wait $PID
echo $?
$!
est une variable spéciale contenant le PID du dernier processus d'arrière-plan lancé.