Ubuntu: Suspend and reboot at specific times using Cron

Harry Lee

February 8, 2015

If you have a server at home and you want it to be on only during specific times and not 24/7, this script is for you.

Cron not only is the best tool for this, it also handles scheduled tasks.

Cron is a system daemon used to execute desired tasks (in the background) at designated times.

Method

  1. Install Cron on Ubuntu if it is not already installed.

  2. Create a new file, suspend_until, in your ~/Documents/ and place the following contents in it. This script is written by Romke van der Meulen.

    #!/bin/bash
        
        # Auto suspend and wake-up script
        #
        # Puts the computer on standby and automatically wakes it up at specified time
        #
        # Written by Romke van der Meulen <redge.online@gmail.com>
        # Minor mods fossfreedom for AskUbuntu
        #
        # Takes a 24hour time HH:MM as its argument
        # Example:
        # suspend_until 9:30
        # suspend_until 18:45
        
        # ------------------------------------------------------
        # Argument check
        if [ $# -lt 1 ]; then
        echo "Usage: suspend_until HH:MM"
        exit
        fi
        
        # Check whether specified time today or tomorrow
        DESIRED=$((`date +%s -d "$1"`))
        NOW=$((`date +%s`))
        if [ $DESIRED -lt $NOW ]; then
        DESIRED=$((`date +%s -d "$1"` + 24*60*60))
        fi
        
        # Kill rtcwake if already running
        sudo killall rtcwake
        
        # Set RTC wakeup time
        # N.B. change "mem" for the suspend option
        # find this by "man rtcwake"
        sudo rtcwake -a -m disk -t $DESIRED &
        
        # feedback
        echo "Suspending..."
        
        # give rtcwake some time to make its stuff
        sleep 2
        
        # then suspend
        # N.B. dont usually require this bit
        #sudo pm-suspend
        
        # Any commands you want to launch after wakeup can be placed here
        # Remember: sudo may have expired by now
        
        # Wake up with monitor enabled N.B. change "on" for "off" if
        # you want the monitor to be disabled on wake
        xset dpms force on
        
        # and a fresh console
        clear
        echo "Good morning!"
        
  3. Change the permission of the file so that it is executable.

        $ sudo chmod +x ~/Documents/suspend_until
    
  4. Run crontab.

        $ sudo crontab -e
    
  5. Place the following line at the end of the file.

          00 02 * * * /home/user/Documents/suspend_until 09:00
    

    This basically tells the server to execute the suspend_until script at 2:00 AM. The 09:00 appended at the end of the line tells the server to wake up at 9:00 AM. The details are all explained in the script.

  6. Save the crontab file and reboot.