Using our knowledge of administrative commands, let us examine a system script. One of the shortest and simplest to understand scripts is "killall," [1] used to suspend running processes at system shutdown.
Example 17-12. killall, from /etc/rc.d/init.d
#!/bin/sh # --> Comments added by the author of this document marked by "# -->". # --> This is part of the 'rc' script package # --> by Miquel van Smoorenburg, <[email protected]>. # --> This particular script seems to be Red Hat / FC specific # --> (may not be present in other distributions). # Bring down all unneeded services that are still running #+ (there shouldn't be any, so this is just a sanity check) for i in /var/lock/subsys/*; do # --> Standard for/in loop, but since "do" is on same line, # --> it is necessary to add ";". # Check if the script is there. [ ! -f $i ] && continue # --> This is a clever use of an "and list", equivalent to: # --> if [ ! -f "$i" ]; then continue # Get the subsystem name. subsys=${i#/var/lock/subsys/} # --> Match variable name, which, in this case, is the file name. # --> This is the exact equivalent of subsys=`basename $i`. # --> It gets it from the lock file name # -->+ (if there is a lock file, # -->+ that's proof the process has been running). # --> See the "lockfile" entry, above. # Bring the subsystem down. if [ -f /etc/rc.d/init.d/$subsys.init ]; then /etc/rc.d/init.d/$subsys.init stop else /etc/rc.d/init.d/$subsys stop # --> Suspend running jobs and daemons. # --> Note that "stop" is a positional parameter, # -->+ not a shell builtin. fi done |
That wasn't so bad. Aside from a little fancy footwork with variable matching, there is no new material there.
Exercise 1. In /etc/rc.d/init.d, analyze the halt script. It is a bit longer than killall, but similar in concept. Make a copy of this script somewhere in your home directory and experiment with it (do not run it as root). Do a simulated run with the -vn flags (sh -vn scriptname). Add extensive comments. Change the commands to echos.
Exercise 2. Look at some of the more complex scripts in /etc/rc.d/init.d. Try to understand at least portions of them. Follow the above procedure to analyze them. For some additional insight, you might also examine the file sysvinitfiles in /usr/share/doc/initscripts-?.??, which is part of the "initscripts" documentation.
[1] | The killall system script should not be confused with the killall command in /usr/bin. |