7

Когда мне приходится ждать медленных команд (например, операций с большими базами данных), я начинаю делать что-то другое и часто не замечаю, что это закончилось, тратя драгоценное время. Я ищу способ, чтобы оболочка предупредила меня (под этим я подразумеваю запуск какой-то пользовательской команды, которую я могу определить), когда команда, которая выполнялась более X секунд, закончилась, и я получил приглашение.

Я использую Bash, но решения для других оболочек также были бы интересны.

3 ответа3

11

Этот сценарий, если он помещен в ваш .bashrc , будет выполнять любую команду, которая вам нравится, всякий раз, когда приглашение возвращается после длительного выполнения команды - настроить "долгое время" (после -gt) в секундах и в фигурных скобках на в той же строке вы можете выполнять любые команды, которые вам нравятся. Вы даже можете отправить себе электронное письмо с хостом, на котором это произошло, и последней выполненной командой и ее кодом состояния.

beep_if_long_time_past() {
    LAST_COMMAND_DURATION=$(($(date +%s) - ${LAST_COMMAND_TIME}))
    [[ ${LAST_COMMAND_DURATION} -gt 60 ]] && { echo "Took long, didn't it?" ; notify-send "I'm done after ${LAST_COMMAND_DURATION} seconds!"; }
    export LAST_COMMAND_TIME=
}

export PROMPT_COMMAND=beep_if_long_time_past
trap '[ -z ${LAST_COMMAND_TIME} ] && export LAST_COMMAND_TIME=$(date +%s)' DEBUG
6
slowcommand; echo -e "\a"

Работает, но некрасиво и неудобно каждый раз добавлять команду уведомления вручную; Также легко забыть. (Уведомление может быть добавлено к уже запущенному процессу с wait как объясняется в этом ответе, но это еще страшнее.)

2

Я обычно использую всплывающее уведомление, xmessage имеет тенденцию быть доступным:

slowcommand; xmessage -center 'Job done!'

Или добавьте напоминание (зависит от демона atd ):

echo 'xmessage -display :0 -center "Check on job"' | at 'now + 10 minutes'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .