Modo semplice per riavviare i processi bloccati?


10

Devo monitorare diversi processi in esecuzione sul mio server web. Per qualche ragione, la vernice attualmente si schianta una volta al giorno o due. Sto usando Monit per presumibilmente riavviare automaticamente la vernice, ma non funziona. Ecco la mia voce monit.conf per Varnish.

check process varnish with pidfile /var/run/varnish.pid
    start program = "/etc/init.d/varnish start" with timeout 60 seconds
    stop program = "/etc/init.d/varnish stop"
    if failed host <my server ip> port 80 protocol http
        and request "/blank.html" then restart
    if 3 restarts within 5 cycles then timeout
    group server

Il file di registro mostra che dopo che la vernice ha smesso di funzionare, i tentativi di riavvio in seguito falliscono tutti. Quindi alla fine monit interrompe il monitoraggio della vernice.

Qualcuno ha suggerimenti su come posso risolvere questo problema? O meglio, puoi suggerire altri semplici modi per monitorare e riavviare automaticamente i processi bloccati? Grazie!


non riesco a credere quanto siano difficili queste cose in tempi pre-sistemati.
Fl0v0

Risposte:


17

Darei un'occhiata a daemontools ( http://cr.yp.to/daemontools.html ).

La supervisione è stata creata proprio per questo scopo: avviare i processi e osservarli, riavviandoli immediatamente in caso di interruzione.

Potresti comunque usare monit se hai bisogno di fare qualcosa di più complicato di un semplice controllo "è ancora in esecuzione", e se il processo deve essere riavviato, allora fallo attraverso supervisione.


Uso anche i daemontools per monitorare processi di servizi instabili. Molto utile se dovessi dire. :-)
edomaur


2

È possibile utilizzare gli script del gestore eventi con Nagios se è disponibile per riavviare i servizi.

Se la vernice richiede il permesso di root per l'avvio (di solito gli script init.d) cambia "/etc/init.d/varnish start" in "sudo /etc/init.d/varnish start". Ma questo probabilmente non sarà abbastanza, dal momento che probabilmente non vuoi dare a qualunque utente monit eseguito come privilegi di sudo nopasswd totali a tutti i comandi e dare sudo a uno script di shell sarebbe sostanzialmente altrettanto cattivo. Quindi dovrai capire quali comandi in quello script init hanno bisogno di sudo, dare a quei comandi i privilegi sudo nel file / etc / sudoers all'utente di monit e infine modificare di conseguenza lo script init. O forse invece di tutta questa vernice può essere eseguito come utente non root?

Infine, sono sicuro che lo sai, ma lo dirò comunque. Stai chiaramente facendo molti sforzi in questo, spero che tu stia facendo tutti gli sforzi per capire perché la vernice si sta schiantando e effettivamente riparandola (o perseguitando gli sviluppatori per capire perché) :-)

Aggiornamento:
questo potrebbe non essere così pulito, ma un modo semplice per farlo come root potrebbe essere quello di impostare uno script che controlli se il processo va bene e se non lo avvia. Quindi esegui quello script ogni due minuti come cron job.


All'inizio ho considerato Nagios, ma volevo qualcosa di piccolo e semplice per i miei scopi. E sì, sto esaminando il problema della vernice. Uno dei miei server lo sta eseguendo da molto tempo, quindi ha sicuramente a che fare con me. :(
Lin,

1

Un altro ottimo metodo preso da StackOverflow :

until myserver; do
    echo "Server 'myserver' crashed with exit code $?.  Respawning.." >&2
    sleep 1
done

Questo potrebbe essere aggiunto al crontab:

crontab -e

Quindi aggiungi una regola per avviare lo script del monitor:

@reboot /usr/local/bin/myservermonitor

O aggiunto come uno script in /etc/init.d

Vedi la risposta StackOverflow per una spiegazione dettagliata del perché questo è un buon approccio.


0

Stavo anche cercando il modo più semplice per gestire questo problema. Il modo più semplice che ho trovato è semplicemente quello di aggiungere Restart=allwaysal .servicefile in questione /etc/systemd/system/multi-user.target.wants/come ultima riga del [service]tag.

Successivamente, sudo systemctl daemon-reloadsegui sudo systemctl restart service.serviceper ricaricare le modifiche.

È possibile verificare verificando se il servizio è in esecuzione systemctl status processname:, controllare il timestamp di avvio. Dopodiché ps -ef | grep servicename, l'annuncio termina il processo con l'id appena trovato kill 1234. dopodiché fai di systemctl status processnamenuovo e controlla se il timestamp di inizio è aggiornato.

Dovrebbe funzionare su:

  • Debian 7 e Debian 8
  • Ubuntu 15.04 e versioni successive
  • CentOS 7 e futured
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.