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).
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It only takes a minute to sign up.
Sign up to join this communityAppend 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.)
paplay
is probably the best command to use to play a sound on a "modern" Linux system.
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
Mar 5, 2011 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.
Sep 17, 2014 at 23:20
\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.
for i in {1..30}; do for j in {1..3}; do printf '\7'; sleep 0.12; done; sleep 0.4; done
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
spd-say
tool associated with speech-dispatcher
, you may need to install a subpackage like speech-dispatcher-utils
(Fedora 24).
Dec 13, 2016 at 18:27
beep
but it became so complicated to configure, spd-say
it's a super cool readily available alternative!
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
notify-more
or notify-send
could indeed be useful alternatives to playing a sound.
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.
play
, aplay
, or paplay
. (My Ubuntu system has aplay
and paplay
by default.)
time python MyScript.py -n 40; paplay /usr/share/sounds/ubuntu/stereo/desktop-login.ogg
worked, thanks.
Mar 5, 2011 at 20:46
Personally, I use my-script && notify-send "done"
. This sends a desktop notification, which on Linux Mint(Cinnamon) looks like this:
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.
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.
bash
orzsh
? There are actually some ways of making this happen automatically, but they're quite involved and depend on which shell you are using.