0

I am working to restart service if stopped.

I was looking for upstart, to restart service. I found some answers.

I took apache2 service for testing. I changed code as below.

# File : /etc/init.d/apache2
...
...
#
# Function that stops the daemon/service
#
do_stop()
{
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred

        # either "stop" or "graceful-stop"
        local STOP=$1
        # can't use pidofproc from LSB here
        local AP_RET=0

        # send stopping apache event
        echo "Stopping....."
        initctl emit stopping-apache2

        if pidof $DAEMON > /dev/null 2>&1 ; then
                if [ -e $PIDFILE ] && pidof $DAEMON | tr ' ' '\n' | grep -w $(cat $PIDFILE) > /dev/null 2>&1 ; then
                        AP_RET=2
                else
                        AP_RET=1
                fi
        else
            AP_RET=0
        fi

        # AP_RET is:
        # 0 if Apache (whichever) is not running
        # 1 if Apache (whichever) is running
        # 2 if Apache from the PIDFILE is running

        if [ $AP_RET = 0 ] ; then
                # send stopping apache event
                echo "Stopped.....1"
                initctl emit stopped-apache2

                return 1
        fi

        if [ $AP_RET = 2 ] && apache_conftest ; then
                $APACHE2CTL $STOP > /dev/null 2>&1
                apache_wait_stop $?
                # send stopping apache event
                echo "Stopped.....2"
                initctl emit stopped-apache2
                return $?
        else
                if [ $AP_RET = 2 ]; then
                                        clear_error_msg
                        APACHE2_INIT_MESSAGE="The apache2$DIR_SUFFIX configtest failed, so we are trying to kill it manually. This is almost certainly suboptimal, so please make sure your system is working as you'd expect now!"
                        killproc -p $PIDFILE $DAEMON
                        apache_wait_stop $?
                        # send stopping apache event
                        echo "Stopped.....3"
                        initctl emit stopped-apache2
                        return $?
                elif [ $AP_RET = 1 ] ; then
                        APACHE2_INIT_MESSAGE="There are processes named 'apache2' running which do not match your pid file which are left untouched in the name of safety, Please review the situation by hand".
                        # send stopping apache event
                        echo "Stopped.....4"
                        initctl emit stopped-apache2
                        return 2
                fi
        fi

}
...
...

Note: emit message using initctl emit stopped-apache2

Then changed apache2.conf to perform start operation on this event.

# File /etc/init/apache2.conf
# apache2
# the purpose of this job is
# * start apache2 in upstart rather than SysV startup

start on stopped-apache2
stop on runlevel [016]


pre-start script
export RUNLEVEL=2
[ -f /var/lib/apache2.enable ] && /etc/init.d/apache2 start
end script

post-stop exec /etc/init.d/apache2 stop

When I stop apache I got message.

root@localhost:~# /etc/init.d/apache2 stop
[....] Stopping web server: apache2Stopping.....
Stopped.....2
. ok

But seems its not executing start on stopped-apache2.

I also restart job using initctl restart apache2.

I missed something ?

5
  • You are trying to make apache automatically restart when you stop it with that script? That's an odd way to go about it. Does /var/lib/apache2.enable exist?
    – psusi
    Oct 30, 2014 at 13:37
  • Your issue is that Upstart does not get events about when init scripts are stopped, only when upstart jobs are stopped. Oct 31, 2014 at 0:57
  • @psusi I want to do same what you mention, automatically restart. I know this is odd way to do things, but I have to do that, no choice for me. :(
    – Nilesh
    Oct 31, 2014 at 4:18
  • @CameronNemo, that's why he explicitly emitted the event in the script
    – psusi
    Oct 31, 2014 at 15:18
  • Oops did not see that, I guess I should have read better. Oct 31, 2014 at 21:09

1 Answer 1

3

You can use the Upstart respawn feature. Use the upstart job for apache found here: https://bitbucket.org/CameronNemo/upstart-jobs/src/2090612200fa588412e3fe22aec5ba3747ae88d2/apache2.conf?at=master

then just add a line that reads respawn.

1
  • Indeed... you don't want the job restarting itself if you explicitly try to shut it down; only if it crashes. That's what the respawn stanza is for.
    – psusi
    Oct 31, 2014 at 15:19

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .