Why won't my script run?

Mark Greenwood fatgerman at ntlworld.com
Sat Mar 14 19:28:43 UTC 2009

On Saturday 14 March 2009 18:43:14 Nigel Ridley wrote:
> Howard Coles Jr. wrote:
> > On Saturday 14 March 2009 12:07:21 pm Mark Greenwood wrote:
> >> Another question for the boffins..
> >>
> >> My Acer Aspire One needs a special script to control the fan. This script
> >> is called /usr/local/bin/acerfand and, when I run it from the command line
> >> it does indeed control the fan. acerfand is a bash script which daemonises
> >> itself using magic I do not understand.
> >>
> >> To get it to start at boot I'm instructed to place the command line into
> >> /etc/rc.local, so ignoring comments my /etc/rc.local now looks like
> >>
> >> #!/bin/sh -e
> >> /usr/local/bin/acerfand
> >> exit 0
> >>
> >> If I run 'sudo /etc/rc.local' from the command line my fan script starts
> >> running, the fan is being controlled and I can see acerfand as a running
> >> process.
> >>
> >> On boot however, the script starts and then immediately exits (I put debug
> >> in, I can see it in syslog starting up and then exiting). There is no
> >> running process called acerfand after boot. Again, I type 'sudo
> >> /etc/rc.local' at a command line and now there is a running acerfand
> >> process.
> >>
> >> Why the different behaviour at boot, and how can I make it work?
> >>
> >> It worked on Mandriva.... ;)
> >>
> >> Thanks,
> >>
> >> Mark
> > 
> > It would be easier to copy your fan control script into the /etc/init.d 
> > directory and then add it to the /etc/rc#.d/ as a softlink with either 
> > "S##acerfan" or "K##acerfan"  (s is for start and the number is the order in 
> > which you want it to start, K is for kill or stop, and again the number 
> > indicates when you want it to stop relative to the other K's in the 
> > directory.).
> > 
> > create a "acerfan" file (using /bin/bash instead of sh as its default on most 
> > Debian based distros) in /etc/init.d with the contents of what you put in 
> > rc.local (leaving off the "exit 0" line).
> > then softlink the script in rc2.d (default runlevel in Debian based distros) 
> > as follows:
> > ln -s /etc/init.d/acerfan /etc/rc2.d/S99acerfan
> > ln -s /etc/init.d/acerfan /etc/rc6.d/K03acerfan
> > that last line is optional.
> > Then see what happens.
> > 
> > 
> The correct Debian way (and I suppose it [still] applies to *ubuntu) is:
> [quote]
> Suppose a system needs to execute script foo on start-up, or on entry to a particular (System V) 
> runlevel. Then the system administrator should:
>      * Enter the script foo into the directory /etc/init.d/.
>      * Run the Debian command update-rc.d with appropriate arguments, to specify which runlevels 
> should start the service, and which runlevels should stop the service.
>      * Consider rebooting the system to check that the service starts correctly (assuming that 
> you've asked for it to be started in the default runlevel). Otherwise, manually start it by 
> running `/etc/init.d/foo start'.
> One might, for example, cause the script foo to execute at boot-up, by putting it in /etc/init.d/ 
> and running update-rc.d foo defaults 19. The argument `defaults' refers to the default runlevels, 
> which means (at least in absence of any LSB comment block to the contrary) to start the service 
> in runlevels 2 through 5, and to stop the service in runlevels 0, 1 and 6. (Any LSB Default-Start 
> and Default-Stop directives in foo take precedence when using the sysv-rc version of update-rc.d, 
> but are ignored by the current (v0.8.10) file-rc version of update-rc.d.) The argument `19' 
> ensures that foo is called after all scripts whose number is less than 19 have completed, and 
> before all scripts whose number is 20 or greater.
> [end quote]
> (Taken from: http://www.debian.org/doc/FAQ/ch-customizing.en.html (11.6)
> Blessings,
> Nigel
OK this is wierd.. I've got it so it runs as you suggest - but it still starts and then exits. In fact, it looks as though something is actually telling it to quit! There is a trap statement in the script that executes a command on receiving INT, TERM, or EXIT and this statement gets executed. I'm not sure what INT does, perhaps that has something to do with it?

But I can still do 'sudo service acerfan start' and it starts and does not exit.. so what's going on? Why does it work from the command line but not as part of the init process?


More information about the kubuntu-users mailing list