Vor einiger Zeit habe ich ein Skript geschrieben, um auf das Ende eines anderen Prozesses zu warten. NOISE_CMD
könnte sowas sein notify-send ...
, vorausgesetzt das DISPLAY
ist 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.sh
auf 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 pgrep
Prozess-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 reptyr
ist 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 reptyr
die schönste und zuverlässigste für meine Zwecke.