web-dev-qa-db-fra.com

Service de démarrage automatique

Je cherche un moyen de configurer un service pour qu'il s'exécute automatiquement lorsqu'il s'arrête pour une raison quelconque. Actuellement, j'ai mis en place un cronjob qui vérifie si le service est exécuté toutes les minutes et le redémarre s'il s'est écrasé, mais cela semble ennuyeux. Comment puis-je faire cela dans le bon sens?

J'ai ajouté quelques scripts douteux pour que le service fonctionne, vous pouvez voir ci-dessous

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

Et aussi 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

Par exemple, lorsque la machine redémarre, je reçois ce statut.

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.
2
php_nub_qq

Vous pouvez utiliser l'outil monit . il est très petit et utile pour tout type de gestion et de surveillance de processus.

Après avoir téléchargé le package binaire de ce lien , vous pouvez l'extraire dans n'importe quel dossier de votre système, puis copier deux fichiers du package sur votre système pour l'installer:

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

Maintenant, éditez /etc/monitrc base sur vos besoins ( référence doc ). puis créez un fichier de contrôle init pour activer monit au démarrage. Maintenant, commencez à surveiller de cette façon:

initctl reload-configuration
start monit
1
Ghasem Pahlavan