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.
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.
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.
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.
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.
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.