The script /etc/rc.local runs at boot time just before user login. But what about a system-wide shutdown script?

Some linux distributions include an /etc/rc.shutdown script that runs at system shutdown, after user logout but before any services or daemons are stopped. It's not difficult to add to ubuntu.

Copy the following text to a file and name it "rc.shutdown" I've included a few comments you can change or delete, and the 3 lines that end in "#optional" can be left out if you like. They just put a little message in the shutdown splash screen. (don't change the first line, "#!/bin/sh" ; it's required!)

/etc/init.d/rc.shutdown
#! /bin/sh
# Don't delete the above line or put anything before it.
# Calls /etc/rc.shutdown before any other shutdown scripts in
# rc0.d or rc6.d are run. Implements a shutdown analog to rc.local.
# Use a link number of K00 to ensure rc.shutdown is called before
# any services or daemons are stopped.
#
# NOTE: Starting runlevel 0 for shutdown or runlevel 6 for 
# reboot does NOT run the Snn... links with "start"
# Entering runlevel 0 or 6 causes ALL links to be run with the argument
# "stop" See /usr/share/doc/sysv-rc/README.runlevels

PATH=/sbin:/bin:/usr/sbin:/usr/bin
. /lib/lsb/init-functions #optional

case "$1" in 
  stop)
    if [ -x /etc/rc.shutdown ]; then
      log_begin_msg "Running local shutdown scripts (/etc/rc.shutdown)" #optional
      /etc/rc.shutdown
      log_end_msg $? #optional
    fi 
  ;;

  restart|reload|force-reload)
    echo "Error: argument '$1' not supported" >&2
    exit 3
  ;;

  start)
    # no op in case link is installed in a normal runlevel
  ;;

  *)
    echo "Usage: $0 start|stop" >&2
    exit 3
  ;;

esac

Put the file in /etc/init.d with root ownership and execute permissions. From a shell prompt in the directory where you have saved the file, you can use the commands:

sudo cp rc.shutdown /etc/init.d
sudo chmod +x /etc/init.d/rc.shutdown

Delete or rename your original, non-root copy of rc.shutdown; we'll be using the same name for another, different file.

Copy the next file, also named rc.shutdown, to /etc/ with executable permission. This is the file where you can include any commands or scripts you want to run at shutdown. The comments in the file explain its use.

/etc/rc.shutdown
#! /bin/sh

# Commands or scripts called from this file will be run at shutdown, 
# before any services or processes are stopped by the normal
# shutdown scripts. By default it does nothing. Your commands or
# script should exit 0 for success or other value on error. 
# Delete the "exit 0" line from this file or make sure your commands 
# are placed before that line.

exit 0

sudo cp rc.shutdown /etc
sudo chmod +x /etc/rc.shutdown

I know, it's a little confusing using 2 different files with the same name, and easy enough to change if you like, but I've followed the same naming convention used for the /etc/rc.local and /etc/init.d/rc.local startup files.

The last thing necessary to actually have this script run at shutdown, is to make the proper links to /etc/init.d/rc.shutdown from the /etc/rc0.d (shutdown runlevel) and /etc/rc6.d (reboot runlevel) directories. The script must run before any system services are stopped, so name the link "K00rc.shutdown" (Those are zeros, not the letter 'O') Use these commands:

sudo ln -s /etc/init.d/rc.shutdown /etc/rc0.d/K00rc.shutdown
sudo ln -s /etc/init.d/rc.shutdown /etc/rc6.d/K00rc.shutdown

You can also use the update-rc.d command line utility to change init script links. (Try man update-rc.d for details) See modifying runlevels for more information.

*  *  *