Il y a quelques temps, j'ai écrit un script pour attendre la fin d'un autre processus. NOISE_CMD
pourrait être quelque chose comme notify-send ...
étant donné que DISPLAY
est correctement réglé.
#!/bin/bash
NOISE_CMD="/usr/bin/mplayer -really-quiet $HOME/sfx/alarm-clock.mp3"
function usage() {
echo "Usage: $(basename "$0") [ PROCESS_NAME [ PGREP_ARGS... ] ]"
echo "Helpful arguments to pgrep are: -f -n -o -x"
}
if [ "$#" -gt 0 ] ; then
PATTERN="$1"
shift
PIDS="$(pgrep "$PATTERN" "$@")"
if [ -z "$PIDS" ] ; then
echo "No process matching pattern \"$PATTERN\" found."
exit
fi
echo "Waiting for:"
pgrep -l "$PATTERN" "$@"
for PID in $PIDS ; do
while [ -d "/proc/$PID" ] ; do
sleep 1
done
done
fi
exec $NOISE_CMD
Sans aucun argument, il suffit de faire du bruit immédiatement. Ce comportement permet de faire quelque chose comme ceci par commodité (disons que vous appelez script ci-dessous alarm.sh
) :
apt-get upgrade ; ~/bin/alarm.sh
Bien sûr, vous pouvez faire beaucoup de choses amusantes avec un tel script, comme laisser une instance de alarm.sh
attendre une instance de alarm.sh
qui attend une autre commande. Ou exécuter une commande juste après la fin d'une tâche d'un autre utilisateur connecté... >:D
Une ancienne version du script ci-dessus pourrait être intéressante, si vous voulez éviter de dépendre de pgrep
et accepter de rechercher vous-même les identifiants de processus :
#!/bin/bash
if [ "$#" -lt 2 -o ! -d "/proc/$1" ] ; then
echo "Usage: $(basename "$0") PID COMMAND [ ARGUMENTS... ]"
exit
fi
while [ -d "/proc/$1" ] ; do
sleep 1
done
shift
exec "$@"
Légèrement hors sujet, mais utile dans des situations similaires : On peut s'intéresser à reptyr
Un outil qui "vole" un processus d'un Shell (parent) et l'exécute dans le Shell actuel. J'ai essayé des implémentations similaires et reptyr
est le plus beau et le plus fiable pour mes besoins.