Shutdown script

Hi Guys,

I want to execute few of my bash script, so that whenever someone calls shutdown now -r command, I want my script to execute first before shutting down.

Any help please?????

I've just started playing with the unix system, so far its been brilliant....

When you reboot, what you actually do is change the runlevel to 6. In /etc/init.d you can find all kinds of scripts that are started/stopped when entering specific runlevels. This is where your script should live (or be symlinked to).

Now change into /etc/rc6.d. You see lots of symlinks to the scripts in /etc/init.d. Some start with a K, some start with an S. When changing to runlevel 6 (read: you execute a shutdown -r now), the services that start with a K will be stopped, the ones starting with an S will be started. (See where I'm going?)

The number after K or S is an indication of the order in which these scripts will be run.

root@k2:/etc/rc6.d# ls -l
total 0
lrwxrwxrwx  1 root root  18 Apr  4  2001 K10ipchains -> ../init.d/ipchains
lrwxrwxrwx  1 root root  14 Mar 26  2001 K11cron -> ../init.d/cron
lrwxrwxrwx  1 root root  17 Mar 26  2001 K12kerneld -> ../init.d/kerneld
lrwxrwxrwx  1 root root  16 Apr  4  2001 K20apache -> ../init.d/apache
lrwxrwxrwx  1 root root  15 Mar 26  2001 K20inetd -> ../init.d/inetd
lrwxrwxrwx  1 root root  17 Mar 26  2001 K20logoutd -> ../init.d/logoutd
lrwxrwxrwx  1 root root  17 Mar 26  2001 K20makedev -> ../init.d/makedev
lrwxrwxrwx  1 root root  17 Apr  4  2001 K20postfix -> ../init.d/postfix
lrwxrwxrwx  1 root root  16 Dec  9  2003 K20rinetd -> ../init.d/rinetd
lrwxrwxrwx  1 root root  15 May  9  2003 K20snmpd -> ../init.d/snmpd
lrwxrwxrwx  1 root root  13 Mar 29  2001 K20ssh -> ../init.d/ssh
lrwxrwxrwx  1 root root  19 Jan 26  2005 K20tivoli-sm -> ../init.d/tivoli-sm
lrwxrwxrwx  1 root tiggr 15 Apr 12  2001 K21resin -> ../init.d/resin
lrwxrwxrwx  1 root tiggr 13 Apr  9  2001 K23ntp -> ../init.d/ntp
lrwxrwxrwx  1 root root  20 Dec  6  2003 K25hwclock.sh -> ../init.d/hwclock.sh
lrwxrwxrwx  1 root tiggr 25 Jul 10  2002 K25nfs-user-server -> ../init.d/nfs-user-server
lrwxrwxrwx  1 root  1005 15 Oct 10  2003 K25resin -> ../init.d/resin
lrwxrwxrwx  1 root root  19 Mar 26  2001 K30setserial -> ../init.d/setserial
lrwxrwxrwx  1 root tiggr 17 May 23  2002 K50proftpd -> ../init.d/proftpd
lrwxrwxrwx  1 root tiggr 14 Apr 20  2003 K85bind -> ../init.d/bind
lrwxrwxrwx  1 root root  13 Mar 26  2001 K89atd -> ../init.d/atd
lrwxrwxrwx  1 root root  15 Apr  4  2001 K89klogd -> ../init.d/klogd
lrwxrwxrwx  1 root root  18 Mar 26  2001 K90sysklogd -> ../init.d/sysklogd
lrwxrwxrwx  1 root root  17 Mar 26  2001 S10portmap -> ../init.d/portmap
lrwxrwxrwx  1 root root  18 Mar 26  2001 S20sendsigs -> ../init.d/sendsigs
lrwxrwxrwx  1 root root  17 Mar 26  2001 S30urandom -> ../init.d/urandom
lrwxrwxrwx  1 root root  22 Mar 26  2001 S31umountnfs.sh -> ../init.d/umountnfs.sh
lrwxrwxrwx  1 root root  20 Mar 26  2001 S35networking -> ../init.d/networking
lrwxrwxrwx  1 root root  18 Mar 26  2001 S40umountfs -> ../init.d/umountfs
lrwxrwxrwx  1 root root  16 Mar 26  2001 S90reboot -> ../init.d/reboot

The above listing is from a Debian-server, your listing may look different.

Now, to execute a script before a reboot, just make sure it's listed here.

You should carefully pick the order in which you execute YOUR script, you don't want to stop your mailserver if you want your script to mail you something. I think you should be safe if you let the symlink to your script start with S10, so it gets executed almost at once.

I have a brand new installation and only consist of S20reboot. So according to your article above, if i create a script called S10test which could contain something like :

#! /bin/sh
echo "hello unix world"

Then if I give it correct premission i.e. chmod a+rwx S10test. Then can I do shutdown now -r and I should see it been executed. Is this correct??

Thanks very much. I'll be unix guru at this rate (LOL) ...

Scripts starting with S are executed on Startup. Scripts starting with K are executed on shutdown. So, no, your script will be seen on boot, not on shutdown.

It's my understanding that K scripts are Killed when you enter that runlevel, and S scripts are Started. So rc6.d/K10ssh will kill the ssh daemon when you enter runlevel 6, but rc6.d/S10foo will start the foo daemon.

All that depends on the init.d/foo or ssh scripts using the right functions to parse $0 correctly, of course. If you don't do that, I don't think it matters what you name the rc?.d script - it'll just run when you enter that runlevel.

Original request

He wants something to run before shutting down - that means he wants a K script - that is why I stated the difference between S and K - he stated he wanted to see execution BEFORE shutting down - naming the script S10test, would cause him to see execution AFTER shutdown on reboot.

That's right, although the execution of your script may happen so fast, you won't see the output.

This can be quite confusing. Last week I had to dig into this matter, because I had to create my own init-script from scratch and I stumbled upon the following text.

So the S10test script will in fact be executed prior to the actual reboot.

indo1144, I suggest you test it.

Create only a S10test (as alpha_manic was doing) in /etc/rc6.d as a link to /etc/init.d. Put in a sleep statement so you don't miss the message. See if it shows up during a shutdown now -r and if it's after the system has completed the shutdown and has restarted or before.

While the server is changing run levels (shutting down) it runs the K scripts, killing off processes - if it also ran the S scripts (to start processes), then you would have processes still running when the server was attempting to reboot.

indo1144,

I looked again at the output you posted for your /etc/rc6.d - very interesting. No wonder you state it will run (and probably will on Debian).

Here's Fedora's /etc/rc6.d listing

 rc6.d]# ls
K01yum                       K20nfs           K65krb524         K87portmap
K02cups-config-daemon        K20tomcat5       K65krb5kdc        K88syslog
K02haldaemon                 K24irda          K66mDNSResponder  K89named
K02NetworkManager            K25squid         K67nifd           K89netplugd
K02NetworkManagerDispatcher  K25sshd          K68rpcidmapd      K89rdisc
K03messagebus                K30sendmail      K69rpcgssd        K90bluetooth
K03rhnsd                     K30spamassassin  K69rpcsvcgssd     K90network
K05anacron                   K35smb           K72autofs         K91isdn
K05atd                       K35vncserver     K73ypbind         K92iptables
K05saslauthd                 K35winbind       K74apmd           K94diskdump
K10cups                      K36mysqld        K74nscd           K95kudzu
K10dc_server                 K50netdump       K74ntpd           K96pcmcia
K10psacct                    K50tux           K75netfs          K99cpuspeed
K10xfs                       K56acpid         K85mdmonitor      S00killall
K12dc_client                 K60crond         K85mdmpd          S01reboot
K15gpm                       K65kadmin        K86nfslock        S10test
K15httpd                     K65kprop         K87auditd

Note, that there are normally only two S scripts - killall and reboot - it would never get to S10test since the reboot script does a halt. Solaris doesn't have a /etc/rc6.d - it runs through the levels and runs all the K scripts and then reboots. So your information is correct for Debian - it may not be correct for any other UNIX OS.

Some more info on the debian rc6.d - K and S scripts in rc6.d

I be~ieve that using K and S for starting and stopping daemon processes is standard for all Sys-V based OSes. In my experience with Solaris, and all Linuxes except Slackware, that's how it works. If you want to put a script before the reboot, you can just rename S01reboot to S02reboot and then make a new S01myscript. Unless you're sourcing /etc/init.d/functions in your script, you could even call it K??myscript (where ?? is an unused location) and it will just run the script at its turn. The S and K magic only happens if you include the init.d/functions file.