Hace un tiempo escribí un guión para esperar el final de otro proceso. NOISE_CMD
podría ser algo así notify-send ...
, dado que DISPLAY
está configurado correctamente.
#!/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
Sin ningún argumento, solo haga un poco de ruido de inmediato. Este comportamiento permite algo como esto por conveniencia (digamos que llama script a continuación alarm.sh
):
apt-get upgrade ; ~/bin/alarm.sh
Por supuesto, puede hacer muchas cosas divertidas con un script de este tipo, como dejar que una instancia alarm.sh
espere una instancia de alarm.sh
, que esté esperando algún otro comando. O ejecutar un comando justo después de que una tarea de otro usuario conectado haya terminado ...>: D
Una versión anterior de la secuencia de comandos anterior puede ser interesante, si desea evitar una dependencia pgrep
y aceptar buscar ID de proceso usted mismo:
#!/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 "$@"
Ligeramente fuera de tema, pero útil en situaciones similares: uno podría estar interesado en reptyr
una herramienta que "robe" un proceso de algún shell (padre) y lo ejecute desde el shell actual. He intentado implementaciones similares y reptyr
es la más bonita y confiable para mis propósitos.