Vor einiger Zeit habe ich ein Skript geschrieben, um auf das Ende eines anderen Prozesses zu warten. NOISE_CMDkönnte sowas sein notify-send ..., vorausgesetzt das DISPLAYist richtig eingestellt.
#!/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
Machen Sie einfach sofort ein paar Geräusche. Dieses Verhalten ermöglicht der Einfachheit halber Folgendes (sagen wir, Sie rufen das folgende Skript auf alarm.sh):
apt-get upgrade ; ~/bin/alarm.sh
Natürlich können Sie mit einem solchen Skript viele witzige Dinge tun, zum Beispiel eine Instanz alarm.shauf eine Instanz von warten lassen alarm.sh, die auf einen anderen Befehl wartet. Oder führen Sie einen Befehl aus, nachdem eine Aufgabe eines anderen angemeldeten Benutzers beendet wurde ...>: D
Eine frühere Version des obigen Skripts könnte interessant sein, wenn Sie eine Abhängigkeit von pgrepProzess-IDs vermeiden und akzeptieren möchten, diese selbst zu suchen:
#!/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 "$@"
Leicht vom Thema abweichend, aber in ähnlichen Situationen nützlich: Möglicherweise reptyrist ein Tool von Interesse , das einen Prozess aus einer (übergeordneten) Shell "stiehlt" und in der aktuellen Shell ausführt. Ich habe ähnliche Implementierungen ausprobiert und bin reptyrdie schönste und zuverlässigste für meine Zwecke.