45

I am executing every now and then some python scripts which take quite long to execute.

I execute them like this: $ time python MyScript.py

How can I play a sound as soon as the execution of the script is done?

I use Ubuntu 10.10 (Gnome desktop).

  • Are you using bash or zsh? There are actually some ways of making this happen automatically, but they're quite involved and depend on which shell you are using. – Mikel Mar 4 '11 at 23:06
  • $ echo $SHELL returns "/bin/bash" – Martin Thoma Mar 5 '11 at 20:39
40

Append any command that plays a sound; this could be as simple as

$ time mycommand; printf '\7'

or as complex as

$ time mycommand && paplay itworked.ogg || paplay bombed.ogg

(Commands assume pulseaudio is installed; substitute your sound player, which will depend on your desktop environment.)

  • 6
    +1 paplay is probably the best command to use to play a sound on a "modern" Linux system. – Mikel Mar 4 '11 at 23:21
  • 4
    printf '\7' doesn't work for me, but this command worked as I wanted it time python MyScript.py -n 40 && paplay /usr/share/sounds/ubuntu/stereo/desktop-login.ogg || paplay /usr/share/sounds/ubuntu/stereo/phone-outgoing-busy.ogg – Martin Thoma Mar 5 '11 at 20:43
  • printf '\7' works for me (paplay doesn't; (git shell)) but it's just a very small bip. Are there more codes that make other sounds? I tried \6, \8 but they are some characters. – laggingreflex Sep 17 '14 at 23:20
  • 2
    @laggingreflex No, \7 (BEL) is usually the only character that possibly triggers a sound (see the Wikipedia article Control character); note that it may not always make a sound, either. – musiphil Nov 20 '14 at 18:31
  • 3
    @laggingreflex You probably don't need this any more but just for laughs ;) for i in {1..30}; do for j in {1..3}; do printf '\7'; sleep 0.12; done; sleep 0.4; done – cprn Aug 24 '15 at 20:49
16

spd-say

sleep 2; spd-say 'get back to work'

Infinite loop with -w if you need extra motivation:

sleep 2; while true; do spd-say -w 'get back to work'; done

Pre-installed on 14.04 via package speech-dispatcher: http://releases.ubuntu.com/trusty/ubuntu-14.04.4-desktop-amd64.manifest for blind people I suppose?

Also add a popup

This combo is a life saver (b stands for beep):

b() ( spd-say 'done'; zenity --info --text "$(date);$(pwd)" & )

and then:

super-slow-command;b

If I'm somewhere in the room, I'll hear it and know that the long job is done.

Otherwise, I'll see the popup when I get back to my computer.

Related: https://stackoverflow.com/questions/7035/how-to-show-a-gui-message-box-from-a-bash-script-in-linux

  • To get the spd-say tool associated with speech-dispatcher, you may need to install a subpackage like speech-dispatcher-utils (Fedora 24). – dfarrell07 Dec 13 '16 at 18:27
9

Just pick a sound on your hard drive, and put a command to play it right after the command you're waiting on; they'll happen sequentially:

$ time python MyScript.py; mplayer ~/ScriptDone.wav

(You can use any player, naturally). I have a script called alertdone that plays a tone and shows an libnotify alert when run; I use it for exactly this occasion:

$ time python MyScript.py; alertdone "Done timing"

It's really simple, so if you want to make your own you can base it on this (mine requires notify-more, mplayer, and ~/tones/alert_1.wav though):

#!/bin/bash
message=${1:-"Finished working"}
notify-more -t 10000 -i /usr/share/icons/gnome/32x32/actions/insert-object.png "Process Finished" "$message"
mplayer ~/tones/alert_1.wav
  • 2
    notify-more or notify-send could indeed be useful alternatives to playing a sound. – Mikel Mar 4 '11 at 23:19
  • @Mikel I'm completely addicted to libnotify; everything on my system pops up notifications – Michael Mrozek Mar 4 '11 at 23:31
8
time python MyScript.py; play /path/so/sound.ogg

play is a very basic (no UI) sound player from the sox Install sox http://bit.ly/software-small package. You can replace it by any other command-line-driven sound player.

  • Yep, play, aplay, or paplay. (My Ubuntu system has aplay and paplay by default.) – Mikel Mar 4 '11 at 23:20
  • 1
    time python MyScript.py -n 40; paplay /usr/share/sounds/ubuntu/stereo/desktop-login.ogg worked, thanks. – Martin Thoma Mar 5 '11 at 20:46
5

Personally, I use my-script && notify-send "done". This sends a desktop notification, which on Linux Mint(Cinnamon) looks like this:

enter image description here

3

You can also make this happen automatically.

I will show you how in zsh, then add info about bash.

The essence looks like this:

preexec()
{
    starttime=$SECONDS
}

precmd()
{
    if ((SECONDS - starttime >= 5)); then
        aplay "sound.wav"
        # or printf "\b", or notify-send, or whatever
    fi
}

You can also make it only do it if the program was Python, e.g.

preexec()
{
    starttime=$SECONDS
    case $3 in python*)
        command_is_python=true;;
    *)
        command_is_python=false;;
    esac
}

precmd()
{
    if $command_is_python && ((SECONDS - starttime >= 5)); then
        aplay "sound.wav"
        # or printf "\b", or notify-send, or whatever
    fi
}

In bash, the best way is to download preexec.bash.txt and source it (e.g. . ~/preexec.bash.txt at the top of your ~/.bashrc, then the above (or something close to it) should work. (Not sure about the $3 bit to check if the command is Python.)

If you're using GNOME Terminal, I would also point you to Flashing GNOME Terminal. It's a patch I wrote that makes the terminal blink when a command is done, so you can Alt-Tab to something else, then it lets you know when it's done.

1

You don't need to add a command to everything, you can actually use a script, that does this automatically for you. It is called undistract-me and it is available on Github.

example

sudo apt install undistract-me    #installs the script (on Debian)
echo 'source /etc/profile.d/undistract-me.sh' >> ~/.bashrc #adds auto-enable to your console
echo 'export LONG_RUNNING_COMMAND_TIMEOUT=XXX' >> ~/.bashrc #where XXX is number of seconds when the command is long enough to alert you
echo 'export UDM_PLAY_SOUND=1' >> ~/.bashrc #to enable sound alert

now start new bash and you are set. Sound and alert can be changed by modifying the script.

-1

Any player can be used. I'm adding cvlc for completeness.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.