How to run commands at shutdown on Linux

How to run commands at shutdown on Linux

Penguins gathered together in the Artic
Image by :

Subscribe now

Get the highlights in your inbox every week.

Linux and Unix systems have long made it pretty easy to run a command on boot. Just add your command to /etc/rc.local and away you go. But as it turns out, running a command on shutdown is a little more complicated.

Why would you want to run a command as the computer shuts down? Perhaps you want to de-register a machine or service from a database. Maybe you want to copy data from a volatile storage system to a permanent location. Want your computer to post "#RIP me!" on its Twitter account before it shuts down?

I should clarify at this point that I'm talking about so-called "one-shot" commands as opposed to stopping a daemon. It's tempting to think of them the same way, though. If you're familiar with SysVinit you might think, "Oh, I'll just create a kill script." For example, /etc/rc.d/rc3.d/K99runmycommandatshutdown should get invoked when your system exits runlevel 3. After all, that's how the scripts in /etc/init.d/ get stopped.

That's a great guess, but it turns out that it's wrong. SysVinit does not blindly run the kill scripts. Instead, it looks for (on Red Hat 6) /var/lock/subsys/service_name (where service_name here would be runmycommandatshutdown). So you have to get a little bit tricky and treat your script like a regular service. The script below gives an example:

# chkconfig: 2345 20 80
# description: An example init script to run a command at shutdown

# runmycommandatshutdown runs a command at shutdown. Very creative.

    # Touch our lock file so that stopping will work correctly
    touch ${LOCKFILE}

# Remove our lock file
# Run that command that we wanted to run

case "$1" in
    start) start;;
    stop) stop;;
        echo $"Usage: $0 {start|stop}"
        exit 1
exit 0

After putting that script in /etc/init.d/runmycommandatshutdown and enabling it with chkconfig on runmycommandatshutdown, your command will be run at shutdown.


All of that is great, but what if you're running a distribution of Linux that uses systemd instead of SysVinit? Turns out, it's much simpler with systemd. All you have to do is put your script in /usr/lib/systemd/system-shutdown/, which is handled by systemd-halt.service. Of course, if you need to manage dependencies in a particular order (e.g., you can't post a tweet if the network stack is down), then you can write a systemd service unit file. For example:

Description=Run mycommand at shutdown




About the author

Ben Cotton - Ben Cotton is a meteorologist by training, but weather makes a great hobby. Ben works as the Fedora Program Manager at Red Hat. He co-founded a local open source meetup group, and is a member of the Open Source Initiative and a supporter of Software Freedom Conservancy. Find him on Twitter (@FunnelFiasco) or at