Нещодавно я написав сценарій, щоб дочекатися закінчення іншого процесу. NOISE_CMD
може бути щось на зразок 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
є найкрасивішим та найнадійнішим у своїх цілях.