понедельник, 28 марта 2011 г.

Сделать после

Сегодня задался вопросом, как можно в шелле дождаться завершения какого-то процесса, и после этого сделать что-нибудь ещё. Порой такая возможность бывает совсем не лишней.

Например, когда ВНЕЗАПНО выясняется, что из-за медленного интернета процесс установки нового пакета (и пятнадцати библиотек, от которых он зависит :) затянется на четверть часа, глупо сидеть и пялиться в экран на ползунок apt-get. Лучше переключиться на другую деятельность, а к новому пакету вернуться только тогда, когда он будет готов. Конечно, можно прервать процесс и запустить заново с добавлением & notify-send "Job done, my Master!" после команды, но это же не Ъ-way!

Мне казалось, что в богатейшем списке утилит командной строки обязательно есть какая-нибудь штукенция, которая позволит решить эту проблему с помощью одной-единственной команды, но гуглёж показал, что магического слова всё же нет, и все используют связку while & wait. Но лень - страшная вещь, и писать каждый раз (даже примитивный) цикл дико ломает.

Поэтому на основе пары источников был создан следующий опус:

% cat doafter
#!/bin/sh

delay=2
pid=$1
shift
cmd=$@
usage=0

if [ "$pid" == "" ]
then
  usage=1
  echo "PID is required"
fi

if [ "$cmd" == "" ]
then
  usage=1
  echo "COMMAND is required"
fi

if [ "$usage" == "1" ]
then
  echo "Usage: doafter PID COMMAND"
  echo "where"
  echo "  PID = Process id to wait for"
  echo "  COMMAND = Command to be executed after it completes"
  exit
fi

while ps -p $pid >/dev/null; do sleep $delay; done
$cmd

Отныне, закинув этот скрипт в /usr/local/bin, я могу уведомлять сам себя о завершении длинного процесса хоть через notify-send, хоть через mpc play, хоть через что-угодно-ещё. Хотя, конечно, если бы существовала "магическая команда" для тех же целей, не пришлось бы и скриптованием заниматься.

В качестве дополнительного упражнения надо будет разобраться, как сделать так, чтобы можно было использовать автодополнение bash/zsh для завершения выполняемой команды. А то ввожу номер процесса, набиваю начало команды, жму таб - а шелл ничего не добавляет! Непорядок :(

Комментариев нет:

Отправить комментарий