2

I'm looking for a way to configure a service to run automatically whenever it stops for some reason. Currently I have set up a cronjob that checks if the service is running every minute and restarts it if it has crashed but that seems dull. How can I do this the right way?

I have added some questionable scripts to make the service work, you can see below

x@x:~$ sudo cat /etc/init.d/my-service
#!/bin/sh
### BEGIN INIT INFO
# Provides: my-service
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

dir="/var/www/html/my-service"
cmd="nodejs chat.js"
user="www-data"

name=`basename $0`
pid_file="/var/run/$name.pid"
stdout_log="/var/log/$name.log"
stderr_log="/var/log/$name.err"

get_pid() {
    cat "$pid_file"
}

is_running() {
    [ -f "$pid_file" ] && ps `get_pid` > /dev/null 2>&1
}

case "$1" in
    start)
    if is_running; then
        echo "Already started"
    else
        echo "Starting $name"
        cd "$dir"
        if [ -z "$user" ]; then
            sudo $cmd >> "$stdout_log" 2>> "$stderr_log" &
        else
            sudo -u "$user" $cmd >> "$stdout_log" 2>> "$stderr_log" &
        fi
        echo $! > "$pid_file"
        if ! is_running; then
            echo "Unable to start, see $stdout_log and $stderr_log"
            exit 1
        fi
    fi
    ;;
    stop)
    if is_running; then
        echo -n "Stopping $name.."
        kill `get_pid`
        for i in {1..10}
        do
            if ! is_running; then
                break
            fi

            echo -n "."
            sleep 1
        done
        echo

        if is_running; then
            echo "Not stopped; may still be shutting down or shutdown may have f                                                                                                                               ailed"
            exit 1
        else
            echo "Stopped"
            if [ -f "$pid_file" ]; then
                rm "$pid_file"
            fi
        fi
    else
        echo "Not running"
    fi
    ;;
    restart)
    $0 stop
    if is_running; then
        echo "Unable to stop, will not attempt to start"
        exit 1
    fi
    $0 start
    ;;
    status)
    if is_running; then
        echo "Running"
    else
        echo "Stopped"
        exit 1
    fi
    ;;
    *)
    echo "Usage: $0 {start|stop|restart|status}"
    exit 1
    ;;
esac

exit 0

And also my-service.service

x@x:~$ cat /etc/systemd/system/my-service.service
[Unit]
Description=my-service daemon

[Service]
ExecStart=/usr/bin/nodejs /var/www/html/my-service/chat.js
Type=simple
User=root
Group=root
Restart=always

[Install]
WantedBy=multi-user.target

For example when the machine reboots I get this as status

Jan 24 10:54:41 x systemd[1]: my-service.service: Service hold-off time over, scheduling restart.
Jan 24 10:54:41 x systemd[1]: Stopped my-service daemon.
Jan 24 10:54:41 x systemd[1]: my-service.service: Start request repeated too quickly.
Jan 24 10:54:41 x systemd[1]: Failed to start my-service daemon.
  • 1
    Possible duplicate of How can I configure a service to run at startup – NeoTheThird Jan 24 '17 at 9:06
  • @NeoTheThird additionally I have also done that and it does not work. Service does not start on startup and I must start it manually. Furthermore I'm asking how to autostart it even if it crashes not only on startup, please read the question before suggesting duplicates. – php_nub_qq Jan 24 '17 at 9:08
  • What does systemctl status my-service report? – muru Jan 27 '17 at 3:09
  • @muru that are the last lines :/ – php_nub_qq Jan 27 '17 at 5:51
  • Only that much? – muru Jan 27 '17 at 5:53
0

You can use monit tool. it's very small and useful for any type of process management and monitoring.

After Downloading binary package from this link, you can extract it to any folder on your system and then copy two files from the package to your system to install it:

cd /path/to/monit/folder
cp ./bin/monit /usr/sbin/monit
cp ./conf/monitrc /etc/monitrc  

Now edit /etc/monitrc base on your needs(reference doc). then create a init control file to enable monit on startup. now start monit this way:

initctl reload-configuration
start monit
|improve this answer|||||
  • initctl is Upstart, so won't work on 16.04 by default. – muru Jan 27 '17 at 5:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.