Некоторое время назад я написал скрипт для ожидания завершения другого процесса. NOISE_CMD
может быть чем-то вроде notify notify-send ...
, учитывая, что DISPLAY
установлен правильно.
#!/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
Без какого-либо шума, просто немедленно пошуметь. Это поведение позволяет что-то подобное для удобства (скажем, вы вызываете скрипт ниже alarm.sh
):
apt-get upgrade ; ~/bin/alarm.sh
Конечно, вы можете сделать много забавных вещей с помощью такого скрипта, например, позволить экземпляру alarm.sh
ожидать экземпляр alarm.sh
, который ожидает какую-то другую команду. Или выполнение команды сразу после того, как какое-то задание другого вошедшего в систему пользователя завершилось ...>:D
Предыдущая версия приведенного выше сценария может быть интересной, если вы хотите избежать зависимости от pgrep
и сами принять идентификаторы процесса поиска:
#!/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 "$@"
Немного не по теме, но полезно в подобных ситуациях: кто-то может быть заинтересован в reptyr
, инструменте, который "крадет" процесс из некоторой (родительской) оболочки и запускает его из текущей оболочки. Я пробовал подобные реализации, и reptyr
- самый красивый и самый надежный для моих целей.