Latest LQ Deal: Complete CCNA, CCNP & Red Hat Certification Training Bundle
Go Back > Forums > Linux Forums > Linux - General
User Name
Linux - General This Linux forum is for general Linux questions and discussion.
If it is Linux Related and doesn't seem to fit in any other forum then this is the place.


  Search this Thread
Old 02-18-2004, 03:30 AM   #1
Registered: Feb 2004
Posts: 38

Rep: Reputation: 15
Strange Script Behavior

While experimenting with building kernel 2.6.2, modifying the initialization scripts caused some confusion that I hope someone here can clarify for me. (I realize this pertains to programming; however, the programming forum here is in the non-Linux section, and since this is a Linux-specific issue I thought that I should put it here.)

I wanted to modify rc.sysinit and halt, as outlined on several web sites related to 2.6 migration, but since I still have kernel 2.4.20-8 [Redhat 9.0 (Shrike)] on the machine, I didn't want to tamper with the original (2.4) scripts. Thus, I moved rc.sysinit to rc.sysinit.2.4 and copied it to rc.sysinit.2.6 for specialization (mounting sysfs, etc.). For rc.sysinit, I wrote the following script:


KERNEL=$(uname -r | awk -F. '{print $1"."$2}')

if [ $KERNEL = "2.6" ]; then
. /etc/rc.d/rc.sysinit.2.6

. /etc/rc.d/rc.sysinit.2.4
This worked like a charm. (Of course, booting into 2.4 complained about the sysfs entry in fstab... But that's beside the point.)

I naively decided to try the same with the halt script (/etc/rc.d/init.d/halt) to change

		awk '$2 ~ /^\/$|^\/proc|^\/dev/{next}
	     		$3 == "tmpfs" || $3 == "proc" {print $2 ; next}
	     		/(^#|loopfs|autofs|devfs|^none|^\/dev\/root)/ {next}
	     		{print $2}' /proc/mounts

		awk '$2 ~ /^\/$|^\/proc|^\/sys|^\/dev/{next}
	     		$3 == "tmpfs" || $3 == "proc" {print $2 ; next}
	     		/(^#|loopfs|autofs|devfs|^none|^\/dev\/root)/ {next}
	     		{print $2}' /proc/mounts
in the 2.6 version.

This didn't seem to cause any problems with rebooting or shutting down for either version of the kernel.

However, upon later study of the halt scripts, I found the following:

# See how we were called.
case "$0" in
	message=$"Halting system..."
	message=$"Please stand by while rebooting the system..."
	echo $"$0: call me as 'halt' or 'reboot' please!"
	exit 1
(Of course, the end of the script calls command.)

Why didn't the halt script fail? How did it know whether to reboot or shut down? What would the machine do on failure? I didn't pass the command line from halt to halt.2.4 or halt.2.6! (I don't even remember seeing the warning. I should probably try it again to confirm it for myself, but I don't want to risk putting the system into an unstable state, now that I realize the logic error.)

I made some simple test scripts to review how shell scripts pass command-line arguments.

Script: test...


./test2 "$@"
Script: test2...


echo "$0"
echo "$1"
echo "$2"

./test -r -t.

-- random arguments -- gave me,


Therefore, this method wouldn't fix the [nonexistent] problem. Running halt or reboot from kernel 2.6 should result in $0=halt.2.6 for halt.2.6, which should choke the script. Am I missing something?

(I think I even rebooted with the command-line passing with no negative symptoms, but I can't say for sure that I did.)

I started to think that rebooting and shutting down from X11 didn't execute the halt script, so I added

echo $"Running halt script..."
to the original script and rebooted. Sure enough, the console showed "Running halt script..." before rebooting.

I decided to restore the original halt script and handle the change with a uname -r test within the script (sloppy, in my opinion)...

But I'd still like to understand this seemingly strange behavior. Does anyone understand what is happening here?


Putting echo "$0" in the halt script revealed that /etc/rc0.d/S01halt and /etc/rc6.d/S06reboot link to /etc/rc.d/init.d/halt and halt somehow sees the respective path in $0.

I replaced halt with the "forking" script and tried echo "$0" in halt.2.4, and again echo reported the path to S06reboot on reboot..

Thus, I have an answer to why the halt script doesn't fail to shut down or reboot the machine. I just don't know how it sees what it sees, when the test bash script (above) would indicate otherwise.


For anyone who wants to maintain both 2.4 and 2.6 kernels, here's the working /etc/rc.d/init.d/halt script:


KERNEL=$(uname -r | awk -F. '{print $1"."$2}')

if [ $KERNEL = "2.6" ]; then
. /etc/init.d/halt.2.6
. /etc/init.d/halt.2.4
(See descriptions of halt.2.4 and halt.2.6 above.)


I found the answer. My test script didn't have a leading '.' before the call to test2. Furthermore, invoked from a symbolic link to test $0 holds the name of the symbolic link. Problem solved. What a difference a "dot" makes.

Last edited by Stranger; 02-18-2004 at 08:46 PM.


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Similar Threads
Thread Thread Starter Forum Replies Last Post
Strange behavior(??) in Samba! bigoli MEPIS 1 06-06-2005 11:43 AM
apache with strange behavior dimc Linux - Software 5 11-07-2004 03:58 PM
Very Strange Behavior raysr Mandriva 4 08-31-2004 02:06 PM
Strange Behavior andrewb758 Linux - Hardware 5 08-31-2003 02:42 PM
strange behavior abhijit Linux - General 3 07-09-2003 11:25 PM > Forums > Linux Forums > Linux - General

All times are GMT -5. The time now is 09:04 AM.

Main Menu
Write for LQ is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Facebook: linuxquestions Google+: linuxquestions
Open Source Consulting | Domain Registration