Я часто даю команды, которые требуют времени. Например, загрузка чего-либо с помощью приложения для загрузки консоли. Если я хочу, чтобы меня заметили, когда команда завершится, я обычно делаю что-то вроде этого:
$ <do something>; echo '<do something> has finished' | osd_cat
Затем я могу переключиться в другое окно и тем временем заняться чем-нибудь другим. Когда это будет сделано, меня заметят.
Теперь моя проблема в том, что мне лень. Ну что ж. Я просто не хочу печатать это каждый раз. Поэтому мне интересно, есть ли демон, который мог бы наблюдать за запущенными процессами и запускать некоторые действия, когда процессы заканчиваются.
Мне нужны параметры конфигурации, чтобы я мог контролировать:
фильтрация процессов, за которыми нужно наблюдать (например, наблюдать за процессами, которые выполняются не менее минуты)
настройка команды для выполнения после завершения процесса
Вы можете попробовать использовать команду Bash "wait", чтобы написать небольшой сценарий-оболочку, например:
#!/bin/bash
command=$*
$command &
wait
osd_cat "$command has finished"
Команда ожидания заставляет скрипт приостанавливаться, пока все дочерние процессы не вернут код выхода. Вы также можете добавить небольшой тайм-аут, чтобы не ждать слишком долго
Может быть, это не демон, но для меня он служит той же цели. zsh
имеет сценарии, выполняемые прямо до и сразу после выполнения любой команды. Вы можете заставить их измерять время настенных часов и запускать любое действие (здесь: notify-send
), если последняя выполненная команда была достаточно длинной. Следующее в отрывке из моей ~/.zshrc
:
preexec () {
ZSH_CMD_START_TIME="$(date +%s)"
ZSH_CMD_NAME="$1"
}
precmd () {
[[ -n "$ZSH_CMD_NAME" ]] && {
ZSH_LAST_TIME=$(($(date +%s) - $ZSH_CMD_START_TIME))
[[ $ZSH_LAST_TIME -gt 60 ]] && [[ -n "$DISPLAY" ]] && { which >/dev/null notify-send } && {
notify-send --urgency=low --category=zsh --expire-time 1500 "ZSH:" '`'"$ZSH_CMD_NAME"'`'" took $ZSH_LAST_TIME seconds."
}
ZSH_CMD_NAME=
}
}
Как насчет простого сценария оболочки, который выполняет длинную команду за вас. Может быть, примерно так:
#!/bin/sh
# tellme: run a command and tell me when it's done
if [ $# -gt 0 ]; then
if $*; then
echo "'$*' has finished" | osd_cat
else
echo "'$*' has finished with errors" | osd_cat
fi
else
echo "usage: $0 <command>"
fi
Затем вы просто запустите эту команду:
tellme <do something>
Конечно, это не демон, поэтому я не думаю, что он поможет вам для вещей, запущенных в фоновом режиме (например, из cron), но он должен выполнять свою работу для интерактивных команд.