10

When I have wait for slow commands (operations on large databases for example), I start doing something else and often don't notice for a long time that it has finished, wasting valuable time. I am looking for a way for the shell to alert me (by which I mean, run some custom command which I can determine) when a command which has been running for more than X seconds has finished and I got back the prompt.

I am using Bash, but solutions for other shells would be interesting as well.

1

3 Answers 3

12

This script, if put in your .bashrc, will execute any command you like whenever the prompt returns after a long time executing a command - customize the "long time" (after the -gt) in seconds, and within the curly braces on the same line you can execute whichever commands you like. You could even send yourself an email with the Host on which this occured and the last executed command and its status code.

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
2
  • This works great, thanks. I stuck with echo -e "\a" which works well with PuTTY (you can configure it to start blinking the taskbar icon instead of giving a sound).
    – Tgr
    Commented Sep 17, 2012 at 8:01
  • Unfortunately, this breaks in MC subshells (MC bug #2027).
    – Tgr
    Commented Sep 18, 2012 at 8:38
6
slowcommand; echo -e "\a"

Works, but it is ugly and inconvenient to append the notification command by hand every time; also easy to forget. (A notification can be appended to an already running process with wait as this answer explains, but that is even uglier.)

2

I usually use a pop-up notification, xmessage tends to be available:

slowcommand; xmessage -center 'Job done!'

Or add a reminder (depends on the atd daemon):

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

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .