62

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).

Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
Martin Thoma
  • 2,802
  • 5
  • 34
  • 45

7 Answers7

58

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.)

geekosaur
  • 31,429
  • 5
  • 79
  • 58
  • 11
    +1 `paplay` is probably the best command to use to play a sound on a "modern" Linux system. – Mikel Mar 04 '11 at 23:21
  • 5
    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 05 '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](http://en.wikipedia.org/wiki/Control_character)); note that it may not always make a sound, either. – musiphil Nov 20 '14 at 18:31
  • `paplay` works well for me. You find a nice free notification sound from CyanogenMod, https://github.com/CyanogenMod/android_frameworks_base/tree/cm-12.0/data/sounds/notifications. I'm using `ogg/Adara.ogg` which has a light percussive sound. – Stephen Niedzielski Apr 16 '15 at 17:26
  • 5
    @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
33

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

or if you prefer the carrot:

sleep 2; while true; do spd-say -t female1 -w "I'm done, come back to me, darling"; 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
  • 1
    Brilliant! I used to use `beep` but it became so complicated to configure, `spd-say` it's a super cool readily available alternative! – Antonio Feb 09 '22 at 16:36
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
Michael Mrozek
  • 91,316
  • 38
  • 238
  • 232
  • 2
    `notify-more` or `notify-send` could indeed be useful alternatives to playing a sound. – Mikel Mar 04 '11 at 23:19
  • @Mikel I'm completely addicted to libnotify; everything on my system pops up notifications – Michael Mrozek Mar 04 '11 at 23:31
  • Arch Linux has a list of “any player”: [Multimedia#Audio players](https://wiki.archlinux.org/title/List_of_applications/Multimedia#Audio_players). My favorite is [mpv](https://en.wikipedia.org/wiki/Mpv_(media_player)). – Franklin Yu Jun 26 '23 at 05:27
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.

Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
6

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

eeze
  • 223
  • 2
  • 7
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.

Mikel
  • 56,387
  • 13
  • 130
  • 149
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.

Jakub Lucký
  • 742
  • 3
  • 11