Ask Ubuntu is a question and answer site for Ubuntu users and developers. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I have written a shutdown script for transmission. Transmission calls the script after a torrent download finishes. The script runs perfectly on my machine (Ubuntu 11.04 & 12.04).

sleep 300s

# default display on current host

# find out if monitor is on. Default timeout can be configured from screensaver/Power configuration.

STATUS=`xset -display $DISPLAY -q | grep 'Monitor'`
echo $STATUS

if [ "$STATUS" == "  Monitor is On" ]

###  Then check if  its still downloading a torrent. Couldn't figure out how.(May be) by monitoring network downstream activity? 


    notify-send "Downloads Complete" "Exiting  transmisssion now"
    pkill transmission

    notify-send "Downloads Complete" "Shutting Down Computer"
    dbus-send --session --type=method_call --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.RequestShutdown


exit 0

The problem is that when I'm downloading more than one file, when the first one finishes, transmission executes the script. I would like to do that but after all downloads are completed.

I want to put a 2nd check ( right after monitor check) if it is still downloading another torrent.

Is there any way to do this?

share|improve this question
up vote 4 down vote accepted

This information isn't passed to the scripts via environment variables, so you'll need to query Transmission's RPC interface. This is sometimes done by client libraries -- for example, a Python script could use python transmissionrpc. There are other interfaces like this listed at .

Here's a quick approach that will use transmission-remote to count the number of non-idle downloads:

transmission-remote yourhost:yourport -tall --info | grep "^  State:" | grep "Down" | wc --lines

If you want to include idle downloads too, you could try this:

transmission-remote yourhost:yourport -l | grep -v -e " 100% " -e "^Sum" -e "^ID" -e " Stopped " | wc --lines

Where "^ID" and "^Sum" strips the header and footer; " 100% " strips completed torrents; and " Stopped " strips out the incomplete-but-paused torrents. This approach isn't foolproof -- for example, a torrent named " 100% Stopped " would break it.

share|improve this answer
Thanks for the python transmission link.I will look into it. – Khurshid Alam Oct 19 '12 at 15:20

I created a better script(from user98677 advice) which takes advantage of transmission's RPC Interface.


Github Gist:

What it Does?

  1. Pause or remove completed torrents after they are completed.

  2. Send a pushover notification (with curl)[optional]

  3. Send a twitter notification (requires twidge)[optional]

  4. Suspend/Shutdown Computer OR leave it as it is.

Pushover Notification From Transmission



On Ubuntu

sudo apt-get install libnotify-bin
sudo apt-get install transmission-cli

On Ubuntu >= 13.04 (For twitter notification):

sudo add-apt-repository ppa:moorhen-core/moorhen-apps
sudo apt-get install twidge

For suspend action on non-Ubuntu distro (Ubuntu uses Upower) install powermanagement-interface package

sudo apt-get install powermanagement-interface

After installation:

  1. Get the code from github-gist & save the file as trsm anywhere on your hard-drive. Make the file executable chmod a+x trsm .

  2. Login to pushover & copy your user key. Paste it under user-key in the script.

  3. If you want notifications send with nice looking application (transmission) icon just create a fake app in pushover with transmission icon & then copy the application key (API/Token key) & paste it under app-key in the script.

  4. For twitter setup see twidge documentation.

  5. Open transmission. Go to preference->web. Enable web client (default port 9091) & enable user authentication . Choose a username & password. Put that username & password in the script as username & password respectively.

  6. Click open web-client to check if it is working properly.

  7. Finally save the script & go to downloading tab (in transmission preference) & click call script when torrent is complete. Select the respective script.



user-key=" "  #put your pushover user-key
app-key=" "  #put your pushover application-key
device=" "    #Your device name in pushover

username=" "  # Transmission remote username
password=" "   # Transmission remote password

sleep 100s

# default display on current host

# authorize transmission
trsm="transmission-remote --auth $username:$password"

# find out number of torrent

TORRENTLIST=`$trsm --list | sed -e '1d;$d;s/^ *//' | cut --only-delimited --delimiter=' ' --fields=1`

 echo "* * * * * Operations on torrent ID $TORRENTID starting. * * * * *"


 DL_COMPLETED=`$trsm --torrent $TORRENTID --info | grep "Percent Done: 100%"`


# pause completed torrents & get those torrent names.

 if [ "$DL_COMPLETED" != "" ]; then
  $trsm --torrent $TORRENTID --stop
  trname=`$trsm --torrent $TORRENTID --info | grep "Name:" | awk -F: '{print $NF}'`

  # post an update to twitter

  echo "$trname download was completed" | twidge update  # Put "#" if you don't need this.

  # push update for pushover

  curl -s \
    -F "token=$user-key" \
    -F "user=$app-key" \
  # -F "device=$device" \  # uncomment, if you want to send notification to a particular device.
    -F "title=Download Finished" \
    -F "message=$trname download has completed." \ > /dev/null

  # The following codes works assuming One take advantage of gnome-power-manager by setting "black screen after 2/5/10/.. minitues ". 
  # if monitor(Including laptop screen but EXCLUDING external monitor) is on, it will  just force blank the screen, if not, it will shutdown/suspend or leave it as it is.
  # Modify it as per your requirement.

  STATUS=`xset -display $DISPLAY -q | grep 'Monitor'`
  #echo $STATUS

  if [ "$STATUS" == "  Monitor is On" ]
      notify-send "Downloads Complete" "turning off the screen now"
          xset dpms force off

      notify-send "Downloads Complete" "$trname"

        # uncomment to shutdown the computer
        #dbus-send --session --type=method_call --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.RequestShutdown

        # uncomment to suspend (on ubuntu)
        #dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend

        # uncomment to suspend (on Linux) (requires powermanagement-interface package)
        #pmi action suspend

  echo "Torrent #$TORRENTID is not completed. Ignoring."

share|improve this answer

A simple script.

Thanx to Khurshid Alam and user98677 I have written this script which is working fine. If display is on (you are working) it makes the Transmission to exit and sends a notification, if not computer is shutdown.

  1. install

    sudo apt-get install transmission-cli libnotify-bin

    in Ubuntu 16.04

    sudo apt install transmission-cli libnotify-bin
  2. Transmission>Preferences>Remote>Check Allow remote Access make sure that HTTP Port is 9091 and only allow these IP Addresses is (default).
  3. Copy paste the given script, save as say '' and make it executable.
  4. Transmission>Preferences>Downloading>Check 'Call script when download is completed', browse to the script.
  5. System Settings>Power>screen brightness>Turn screen off when inactive for>select reasonable time.

    sleep 300s
    STATUS=$(xset -display $DISPLAY -q | grep 'Monitor')
    STATE=$(transmission-remote -tall --info | grep "^  State:" | grep "Down" | wc --lines)
        [ "$STATUS" == "  Monitor is On" ] && [ "$STATE" == "0" ]
        notify-send "Downloads Complete" "Exiting  transmisssion now"
        pkill transmission
         [ "$STATE" == "0" ]
        #in Ubuntu 16,04
        shutdown -h now
        #in older versions use the following
        #dbus-send --session --type=method_call --print-reply --dest=org.gnome.SessionManager /org/gnome/SessionManager org.gnome.SessionManager.RequestShutdown
    exit 0
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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