Il y a quelque 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é qu'il DISPLAY
est correctement défini.
#!/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 segment, faites juste du bruit immédiatement. Ce comportement permet quelque chose comme ça pour plus de commodité (disons que vous appelez le script ci-dessous alarm.sh
):
apt-get upgrade ; ~/bin/alarm.sh
Bien sûr, vous pouvez faire beaucoup de choses drôles avec un tel script, comme laisser une instance d' alarm.sh
attendre une instance de alarm.sh
, c'est-à-dire attendre une autre commande. Ou exécuter une commande juste après la fin de la tâche d'un autre utilisateur connecté ...>: D
Une ancienne version du script ci-dessus peut être intéressante, si vous voulez éviter une dépendance pgrep
et accepter de rechercher vous-même les ID 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 pourrait être intéressé par reptyr
un outil qui "vole" un processus d'un shell (parent) et l'exécute à partir du shell actuel. J'ai essayé des implémentations similaires et reptyr
c'est la plus jolie et la plus fiable pour mes besoins.