LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Slackware (https://www.linuxquestions.org/questions/slackware-14/)
-   -   rc.httpd and rc.mysqld break startup scripts (https://www.linuxquestions.org/questions/slackware-14/rc-httpd-and-rc-mysqld-break-startup-scripts-702087/)

geek745 02-03-2009 08:42 PM

rc.httpd and rc.mysqld break startup scripts
 
Hello fellow slackers,

On my SW12.1 box I am trying to get both httpd and mysqld to startup on boot. However, they are mutually destructive with respect to their startup routines. And it does not matter whether I have them listed in rc.inet2 or rc.M or rc.local - either way the first guy will kill the rest of the startup chain.

Both scripts have
Code:

exit 1
and
Code:

exit 0
lines in them, and even if rc.M called rc.inet2, which contained either one (or both) of the scripts, it would ultimately exit rc.M, and then init will call rc.4 and send me to KDE. Looking back at the logs, any startup scripts called after rc.httpd or rc.mysqld fail to run.

My initial thought was to comment out the various exit statements in both scripts. This proves to be fishy business because rather than exiting prematurely on an error (or success), the script continues to chew through its remaining lines, which screws things up.

The thought just occurred to me (writing this during a MIPS assembly language class talking about jumps and such) that I should probably create a label at the end of the file and rather than exit, just "jump to the end." I'll try this later, but hopefully this is the end of the line for me. I haven't had this problem before on my LAMP setups, so I wonder a bit if it should be this much work... any thoughts appreciated.

astrogeek 02-03-2009 09:33 PM

Is MySQL initialized?
 
Rather than being 'mutually destructive' it sounds more like MySQL has not been initialized yet. Did you run mysql_install_db or otherwise set up the initial database?

See the comments at top of /etc/rc.d/rc.mysqld.

If you have already done this how about a little more info on your setup.

XGizzmo 02-03-2009 10:39 PM

Nether rc.httpd or rc.mysqld have any exit in them and both of them are already sourced from rc.M.
All you have to do is make the rc.* files executable and they will be ran. As far as the exit making
the parent script end it depends on if it was sourced into the calling script or if it was "ran" and
how the shell has been configured.

geek745 02-04-2009 01:25 AM

3 Attachment(s)
the last lines of /etc/rc.d/rc.M:
Code:

# Start the MySQL database:
if [ -x /etc/rc.d/rc.mysqld ]; then
  . /etc/rc.d/rc.mysqld start
fi

# Start Apache web server:
if [ -x /etc/rc.d/rc.httpd ]; then
  . /etc/rc.d/rc.httpd start
fi

# Start the local setup procedure.
if [ -x /etc/rc.d/rc.local ]; then
  echo "Running rc.local:"
  . /etc/rc.d/rc.local
fi

I attached my complete rc.httpd (which calls apachectl, also attached) and rc.mysqld, in their original state.

XGizzmo, you were suggesting that if I replaced the line that said
Code:

  . /etc/rc.d/rc.httpd start
with
Code:

/bin/sh /etc/rc.d/rc.httpd start
that it might work correctly?

astrogeek 02-04-2009 01:35 AM

What do you get if you try to start mysql after you boot?

As root, (assuming /etc/rc.d/rc.mysqld is executable)

Code:

/etc/rc.d/rc.mysqld start
...what messages do you get?

geek745 02-04-2009 01:45 AM

Each script starts its respective server on its own with no errors - works beautifully, it's just that anything I try to start after them (including the other one) is screwed.

For your amusement, this is what I get (just now):
Code:

xxx@xxx:xxx$ sudo /etc/rc.d/rc.mysqld start
Starting MySQL SUCCESS!
xxx@xxx:xxx$ sudo /etc/rc.d/rc.httpd start
Starting Apache...
xxx@xxx:xxx$

No errors! Just as it is, when my machine booted today, the last two lines of init's output were:
Code:

Starting MySQL. SUCCESS!
Starting up X11 session manager...

And I believe it to be the fact that rc.mysqld contains the line "exit 0" and rc.httpd (in apachectl) contains the statement "exit $ERROR_CODE" which is effectively "exit 0" at runtime that causes my troubles.

I moved the two server startup blocks to rc.local for testing just now, and changed the ". " invocation to a full "/bin/sh" invocation, hoping for a forked shell that can absorb the extra "exit" and return to hit the next one the same way:
Code:

# Start the MySQL database:
if [ -x /etc/rc.d/rc.mysqld ]; then
  /bin/sh /etc/rc.d/rc.mysqld start
fi

# Start Apache web server:
if [ -x /etc/rc.d/rc.httpd ]; then
  /bin/sh /etc/rc.d/rc.httpd start
fi

and voila - it works:
Code:

xxx@xxx:/etc/rc.d$ sudo ./rc.local
Starting MySQL SUCCESS!
Starting Apache...
httpd (pid 6163) already running
xxx@xxx:/etc/rc.d$

Thanks for all the pointers!

astrogeek 02-04-2009 02:03 AM

Quote:

Originally Posted by geek745 (Post 3431447)
For your amusement, this is what I get (just now):
Code:

xxx@xxx:xxx$ sudo /etc/rc.d/rc.mysqld start
Starting MySQL SUCCESS!
xxx@xxx:xxx$ sudo /etc/rc.d/rc.httpd start
Starting Apache...
xxx@xxx:xxx$


I usually like being amused ;), thanks. I just wanted to be sure MySQL had been initialized as I did not get that from the original post.

Anyway, glad you got it going.

Alien Bob 02-04-2009 03:31 AM

Quote:

Originally Posted by geek745 (Post 3431216)
Hello fellow slackers,

On my SW12.1 box I am trying to get both httpd and mysqld to startup on boot. However, they are mutually destructive with respect to their startup routines. And it does not matter whether I have them listed in rc.inet2 or rc.M or rc.local - either way the first guy will kill the rest of the startup chain.

Both scripts have
Code:

exit 1
and
Code:

exit 0
lines in them, and even if rc.M called rc.inet2, which contained either one (or both) of the scripts, it would ultimately exit rc.M, and then init will call rc.4 and send me to KDE. Looking back at the logs, any startup scripts called after rc.httpd or rc.mysqld fail to run.

Your problem is the fact that you are not using Slackware rc scripts. Both your rc.mysql and rc.httpd are scripts from another source. The official Slackware scripts do not have "exit" statements because they are sourced from rc.M ... the "exit" in rc.mysql causes the rc.M script to exit as well due to the source command used to include rc.mysql in rc.M .

Is there a reason why you are not using Slackware's scripts?

Eric

GazL 02-04-2009 08:32 AM

A quick perusal of rc.M seems to show some of the called subsystem rc scripts are sourced in and some are called with their own shell process..

Wouldn't it just be better to spawn new shells for all of the subsystem scripts and reduce the chance of possible cross contamination or other errors from customised subsystem scripts?

Though sourcing as much as possible may provide some small performance gain during startup, wouldn't the consistency and resilience of spawning a new shell for each of them be worth any additional cost in overhead?

guanx 02-04-2009 10:17 AM

Quote:

Originally Posted by GazL (Post 3431867)
Though sourcing as much as possible may provide some small performance gain during startup, wouldn't the consistency and resilience of spawning a new shell for each of them be worth any additional cost in overhead?

Highly agree.

geek745 02-05-2009 11:03 PM

AlienBob:

rc.mysqld is a symlink to /usr/local/share/mysql/mysql.server, which is the provided shell script for starting the mysql server, and is init-script-compliant (rc.mysqld start works) except for the fact that it exits. Thus it is not an official Slackware script.

rc.httpd I believe I wrote myself, following the example of other basic init scripts using the simple Bash case...esac structure. This calls apachectl, as you have seen, and that is where the exit occurs.

GazL:

I did not write the remainder of rc.M - the default behavior was to source all subsequent rc scripts as they were - I see now that this may be the safest procedure...

guanx 02-06-2009 04:24 AM

Quote:

Originally Posted by geek745 (Post 3433754)
I did not write the remainder of rc.M - the default behavior was to source all subsequent rc scripts as they were - I see now that this may be the safest procedure...

Excuse me, but do you mean source-ing the scripts is safer than sh-ing them?

GazL 02-06-2009 05:58 AM

Quote:

Originally Posted by geek745 (Post 3433754)

GazL:

I did not write the remainder of rc.M - the default behavior was to source all subsequent rc scripts as they were - I see now that this may be the safest procedure...

I didn't say you did. The point I was making is that the stock slackware rc.M is inconsistent, sometimes sourcing stuff, other times calling them with their own shell process. I was hoping that my comment might have prompted one of the devs to consider the issue and if it turned out that they agreed then perhaps we'd see a more resilient/consistent approach in a future release.

Didier Spaier 02-06-2009 06:19 AM

Quote:

Originally Posted by GazL (Post 3434021)
I was hoping that my comment might have prompted one of the devs to consider the issue and if it turned out that they agreed then perhaps we'd see a more resilient/consistent approach in a future release.

Feel free to append your proposal for enhanced startup scripts to your next post. :cool:

GazL 02-06-2009 06:50 AM

Quote:

Originally Posted by Didier Spaier (Post 3434040)
Just append your proposal for updated startup scripts to your next post. :cool:

In this case, the change is fairly self evident.
Code:

sed -e 's:\. /etc/rc.d/rc.:/bin/sh /etc/rc.d/rc.:g' /etc/rc.d/rc.M
I haven't tested it, but that's the gist of it.

Didier Spaier 02-06-2009 07:26 AM

Quote:

Originally Posted by GazL (Post 3434070)
In this case, the change is fairly self evident.
Code:

sed -e 's:\. /etc/rc.d/rc.:/bin/sh /etc/rc.d/rc.:g' /etc/rc.d/rc.M

I do not see what is your point here. What is the practical advantage of replacing scripts' sourcing by scripts' running ?

GazL 02-06-2009 07:32 AM

Quote:

Originally Posted by Didier Spaier (Post 3434100)
I do not see what is your point here. What is the practical advantage of replacing scripts' sourcing by scripts' running ?

The point is that some people may run customised rc scripts. The original poster is a case in point. He used non-standard rc.httpd which included a 'exit' which broke rc.M. By changing them all to run in their own shell process, you protect rc.M from customisations to the files it calls. It's a very minor change, but it's all about resiliency. If you run the standard rc.'s you have no problems with it as long as everything is stock, but I'm a belt and braces guy when it comes to things as important as system starup scripts.

Didier Spaier 02-06-2009 07:47 AM

Quote:

Originally Posted by GazL (Post 3434110)
The point is that some people may run customised rc scripts. The original poster is a case in point. He used non-standard rc.httpd which included a 'exit' which broke rc.M.

IMHO, if someone replaces or edit a startup script, he/she should be wise and skilled enough to prevent possible unwanted side effects of his/her changes.

Is that so difficult e.g. to type "grep rc.httpd /etc/rc.d/*" and check the output ?

piete 02-06-2009 07:56 AM

Would you not have to replace all the /path/to/binary portions of the rc scripts with `exec /path/to/binary` to stop having a bajillion spawned shell processes?

Also spawning a new shell for everything would affect 'global' variables like PS1, PATH, etc, to the extent that they would never appear in any scope other than the one that was spawned (and has maybe since been exec'd away).

I sympathise with the OP that his rc.M broke, but it broke because of poor understanding of the startup mechanisms. Knowing that (by default) startup scripts are all sourced and modifying your custom scripts to match the default is surely a better method than rewriting the entire init procedure to match some generic scripts that have been written as an example. Likewise, knowing that you can change rc.M where you prefer your own scripts to the 'official' ones is also a valid approach, which has been applied successfully I think to solve the OP's original problem.

For discussions on source vs shell, maybe a new thread would be a plan get the best exposure?

- Piete

guanx 02-06-2009 08:48 AM

Quote:

Originally Posted by Didier Spaier (Post 3434100)
I do not see what is your point here. What is the practical advantage of replacing scripts' sourcing by scripts' running ?

1. To prevent namespace pollution. This one benifit is good enough.

2. More friendly to non-sh scripts. For example, "rc.udev" is a bash-only script. I myself would also like to use python, in which case "source" is nonsense. If everything is run directly, the calling command need not be changed even if the interpreter changed, or even if the script is replaced by an ELF program. I have both cases in my /etc/rc.d/

I usually write a new script with sh; then when it grows, if I find difficulty, I change to python; in the end, if I think the script needs no more change, I sometimes re-write it in C. Because I don't use "source", the "rc.*" scripts themselves need not be changed.

Alien Bob 02-06-2009 09:17 AM

I think if you decide to mess with the Slackware default scripts, you should be prepared to change anything that prevents total disaster. If you change scripts and add "exit" statements, you are responsible for changing the source-ing to spawning an external shell for the script's execution. Using python during early bootup is certainly not recommended because of the library files it needs in /usr/ ... you can not be certain (when you write scripts to be used on many different computers) that the /usr directory is available that early. It may be on a separate partition which is only mounted later.

Slackware's rc scripts will likely remain as they are, since I have not heard a good reason why they should change. Spawning a subshell will make the boot stage's shell environment unavailable to the script. Variables set of changed inside the script would vanish once the script ends.

Eric

guanx 02-06-2009 09:29 AM

Quote:

Originally Posted by Alien Bob (Post 3434208)
I think if you decide to mess with the Slackware default scripts, you should be prepared to change anything that prevents total disaster. If you change scripts and add "exit" statements, you are responsible for changing the source-ing to spawning an external shell for the script's execution.

It was not me who put "exit" into the script ... Nevertheless, you can see in newer versions of Slackware that many startup scripts are really sh-ed instead of source-ed.

I think it will be even better to omit the sh. "/etc/rc.d/SCRIPT_NAME" is enough because some scripts, e.g. "rc.udev", is not sh-compatible (rc.udev is bash-only).

Quote:

Using python during early bootup is certainly not recommended because of the library files it needs in /usr/ ... you can not be certain (when you write scripts to be used on many different computers) that the /usr directory is available that early. It may be on a separate partition which is only mounted later.
Yes. I can be quite sure "/usr" is mounted early enough. You can find a lot of things if you "grep -l /usr/sbin /etc/rc.d/rc.*".

Quote:

Slackware's rc scripts will likely remain as they are, since I have not heard a good reason why they should change. Spawning a subshell will make the boot stage's shell environment unavailable to the script.
Not true. The spawned shell will inherit the environment variables from the calling shell.

Quote:

Variables set of changed inside the script would vanish once the script ends.

Eric
What are these variables? I mean the "useful" ones, i.e. the ones will be used by subsequent scripts.

If you must export variables, I think it's better to do it this way:
Code:

# ******* This is /etc/rc.d/rc.M ********
if [ -x /etc/rc.d/rc.servars ]; then
  `/etc/rc.d/rc.setvars`
fi

Code:

#! /usr/bin/env python
# ******* This is /etc/rc.d/rc.servars *******
import sys, os
sys.stdout.write('export TMP_MAX=%u' % os.TMP_MAX)
sys.stderr.write('This is %s\n' % sys.argv[0])


Didier Spaier 02-06-2009 09:44 AM

Guanx, my guess is you won't convince Slackware team to make the changes you propose.

But nobody prevents you to fork Slackware -- you would not be the first, anyway.

Meanwhile I will stick to the original ;)

Cheers,

guanx 02-06-2009 10:36 AM

Quote:

Originally Posted by Didier Spaier (Post 3434239)
Guanx, my guess is you won't convince Slackware team to make the changes you propose.

But nobody prevents you to fork Slackware -- you would not be the first, anyway.

Meanwhile I will stick to the original ;)

Cheers,

I am not talking about what they should do. I am simply suggesting which is better :P

Actually, Slackware has already changed many "source SCRIPT_NAME" commands in "rc.M" and alikes to "sh SCRIPT_NAME". This means there are not so may environment variables to export as Eric thought. Preventing namespace pollution is more important.

Now because the scripts are not source-ed generally, if I want to use python instead sh, I can write the script this way:
Code:

#! /bin/sh

"exec" "python" "$0" "$@"
print 'This is Python'

It works as long as you don't "source" it. Furthermore, if you run it directly without specifying the interpreter, this ugly trick can go away and the code will look more beautiful.

GazL 02-06-2009 03:08 PM

Quote:

Originally Posted by Alien Bob (Post 3434208)
I think if you decide to mess with the Slackware default scripts, you should be prepared to change anything that prevents total disaster. If you change scripts and add "exit" statements, you are responsible for changing the source-ing to spawning an external shell for the script's execution.

I agree, one should expect people making customisations to get it right, but having a consistent approach, i.e. calling all the sub scripts in the same manner, will help them get it right. As was mentioned above some are currently sourced into the current shell of rc.M and some are run in a new shell. It's a mess. It works, but it's clearly not tidy!

Then you have the issue of fault tolerance. Expecting someone making customisations in sub scripts to get it right is reasonable enough, but what's so wrong with making rc.M able to cope with errors regardless. It's just sound design and good programming practice.

Actually, on reflection, I like guanx idea of not even prefixing them with the shell at all and letting the interpreter string identified within the script file determine what executable is used to run it.



Quote:

Originally Posted by Alien Bob (Post 3434208)
Using python during early bootup is certainly not recommended because of the library files it needs in /usr/ ... you can not be certain (when you write scripts to be used on many different computers) that the /usr directory is available that early. It may be on a separate partition which is only mounted later.

We're talking specifically about rc.M and the subsystem scripts such as rc.httpd called from it. Filesystems will have already been mounted by this point.

Quote:

Originally Posted by Alien Bob (Post 3434208)

Slackware's rc scripts will likely remain as they are, since I have not heard a good reason why they should change. Spawning a subshell will make the boot stage's shell environment unavailable to the script. Variables set of changed inside the script would vanish once the script ends.

The rc.whatever sub scripts are all designed to be run individually, so that subsystems can be stopped/started manually. So, passing environment variables back and forth shouldn't be an issue. Wouldn't any requirements to pass environment variables between several scripts break this functionality?


If you want to take the line that: it's 'good enough' as it is and doesn't need changing, then that's fair enough, but that doesn't mean that these suggestions are without merit.

I can see that guanx is on the same wavelength as I am here, I guess I'll have to settle for that.

bsurfin 02-11-2009 03:51 AM

I Have Slackware 12.1 running really fast and flawlessly on my new Dell laptop, I used the command above: mysql_install_db , and it got my mysql server working pretty much instantly. What script can I use to get the mysql server to boot when I boot the laptop up ?

Does Slackware have a command to run a process manager?

gnashley 02-11-2009 04:14 AM

I haven't checked the init scripts in question, but I suspect that the fact that some are simply sourced while others are run in a separate proces (using sh)has to do with whether the called process runs as a backgrounded daemon or not. If you source a script which starts a process which does not background itelf, then the init process would hang right there. Such a process would have to be run with a separate process to allow the normal bott process to continue.

astrogeek 02-11-2009 11:45 AM

Quote:

Originally Posted by bsurfin (Post 3439353)
What script can I use to get the mysql server to boot when I boot the laptop up ?

Does Slackware have a command to run a process manager?

Slackware uses BSD-style process management. You manage boot processes primarily by setting the execute status of scripts in /etc/rc.d/, and possibly by edits of /etc/rc.d/rc.local.

To make MySQL start at boot simply make /etc/rc.d/rc.mysqld executable. As root...
Code:

chmod 755 /etc/rc.d/rc.mysqld
To 'turn off' any process...

Code:

chmod 644 /etc/rc.d/rc.script_name
...with the desired script name.


All times are GMT -5. The time now is 08:47 AM.