1

I have the problem that my apache2 doesn't start at boot. After debugging I found out that a webpage init script tried to connect to MySQL which isn't running at that time.

My OS is Ubuntu Server 10.04.4

apache2 boot is set up using update-rc.d apache2 defaults 21 which creates the scripts in /etc/rcX:

root@ser:~# find /etc/rc* -name *apache*
/etc/rc0.d/K21apache2
/etc/rc1.d/K21apache2
/etc/rc2.d/S21apache2
/etc/rc3.d/S21apache2
/etc/rc4.d/S21apache2
/etc/rc5.d/S21apache2
/etc/rc6.d/K21apache2

and calls /etc/init.d/apache2

mysql is getting started by Ubuntu's upstart:

root@ser:~# ls /etc/init | grep mysql
mysql.conf

How can I force apache2 to start AFTER mysql?

Update:

Since I got already a few comments, here a clarification:

Apache is started as a sysvinit script under /etc/rc*.d/ whereas mysql is an upstart script under /etc/init/. Mysql isn't listed under /etc/rc*.d and thus I can't change the priority by changing the alphabetical order!

Stefan Profanter
  • 365
  • 1
  • 5
  • 16
  • The answer to your question is YES. – mdpc Jun 05 '13 at 19:16
  • Please do your research, this type of question has no doubt been asked and answered a number of times either here or in SuperUser or Unix SEs. – mdpc Jun 05 '13 at 19:18
  • 1
    I did my research, but it seems my question wasnt clear enough. The only thing I found was on how to change the priority when both scripts are under /etc/rc*.d/. But the problem here is that one is a sysvinit script, the other an upstart script. – Stefan Profanter Jun 05 '13 at 19:27
  • Can you give more details about the 'webpage init script tried to connect to MySQL'. I would guess that apache would start, and one web site can't connect to mysql, but will work fine after mysql gets started. Is this the problem you are seeing? – becomingwisest Jun 05 '13 at 20:24
  • 1
    I found this, might be helpful [askubuntu][1] [1]: http://askubuntu.com/questions/109516/managing-dependency-across-upstart-and-sysv-style-init-d-script – APZ Jun 05 '13 at 20:38
  • There you go: http://serverfault.com/a/513527/127919. Check my answer for detailed info about the 'webpage init script' – Stefan Profanter Jun 05 '13 at 20:42

1 Answers1

2

To answer my own question:

Here is a quick and dirty way to block the apache script until mysqld is started:

Replace the two lines in /etc/init.d/apache2

 log_daemon_msg "Starting web server" "apache2"
 if $APACHE2CTL start; then

with

log_daemon_msg "Starting web server" "apache2"

# wait until mysql started
MYSQL_OK=0
WHILE_CNT=0
while [ "$WHILE_CNT" -le 60 ] ; do
        if [[ `service mysql status` == *running* ]]; then
          MYSQL_OK=1;
          break;
        fi
        WHILE_CNT=`expr $WHILE_CNT + 1`;
   sleep 1
done

if $APACHE2CTL start; then

This checks every one second if mysql is running (maximum check time is 60 seconds).

But there should be a better way to defince dependencies between sysvinit and upstart services?!

Stefan Profanter
  • 365
  • 1
  • 5
  • 16
  • 1
    I don't really agree with this approach of looping INSIDE a startup script. How are you assured that mysql will be coming up at all and in which order it is being called. – mdpc Jun 05 '13 at 19:49
  • 1
    You are right! This script blocks for at maximum 60 seconds the whole bootup proces. Thus I wrote 'quick and dirty'. There isn't any assurance that mysql will come up. As far as I understood, Upstart and Sysvinit are executed in parallel. Thus mysql should come up during the time apache waits. If it doesn't, than apache wouldn't start neither (which makes sense because the webpage needs mysql). I think there should be a better way to do this which avoids these problems! – Stefan Profanter Jun 05 '13 at 20:29