Come monitorare un servizio e riavviare se interrotto in Linux


24

In realtà non sono così sicuro se dovrei usare gli script di shell, o se ci sono già alcuni modi. Ma qualunque sia l'approccio che utilizziamo, vorrei mantenere un servizio sempre attivo.

Diciamo iptablescome esempio. Poi ..

  • Ogni volta che il iptablesservizio è stoppedo (in altre parole) non in esecuzione, voglio che sia started(o restarted) .. automaticamente ogni volta che si interrompe (o non è in esecuzione).
  • In altre parole, voglio mantenere un servizio sempre attivo.

(Forse potrei dare una buona frequenza per verificare, se il problema è fare il controllo in tempo reale . Quindi diciamo, ogni 5 minuti)

L'unico modo in cui mi viene in mente è usare gli script di shell con Cron Tab.

  • C'è qualche soluzione intelligente per favore?

Grazie!


Non dovresti farlo. Supponiamo che un servizio non sia configurato correttamente, quale sarebbe la tua strategia? Un elenco infinito di nuove prove. Dovresti invece scrivere uno script crontab alertssu qualcosa che non funziona.
MariusMatutiae,

Sono solo curioso della soluzione diretta, per la domanda originale. Inoltre, ho un servizio che deve essere semplicemente restartedogni volta che si ferma, per qualsiasi motivo. Nessun problema con il riavvio.
夏 期 劇場

1
La tua soluzione suggerita è abbastanza intelligente. Se lo usi correttamente (esci immediatamente se il servizio è già in esecuzione, avvisa che il servizio è stato interrotto in modo da poterlo riparare, e così via ....) è il modo più semplice. Un servizio che si interrompe automaticamente è un servizio problematico, quindi alla fine dovresti risolverlo, ma altrimenti, come patch temporanea, uno script cron o un altro demone super-semplice che dorme la maggior parte del tempo farà il lavoro bene. Ci sono alcuni strumenti come mmonit.com/monit ma penso che alla fine tutti usino un approccio simile

@MariusMatutiae, sono d'accordo con il tuo punto, ma dipende dalla natura del servizio e la maggior parte dei gestori dei processi si riavvierà dopo un certo numero di riavvii falliti. È perfettamente ragionevole che un processo finisca naturalmente e per noi desideriamo riavviarlo automaticamente, ad esempio un lavoratore che preleva un lavoro da una coda e termina dopo ogni esecuzione. È anche uno strumento utile per gli amministratori di sistema che soffrono di codice su misura che perde memoria - limita la durata di un processo e riavvialo automaticamente prima che possa sfuggire di mano ...
Alex Forbes,

Risposte:


25

Aggiornamento marzo 2018

Questa risposta ora è piuttosto vecchia e da quando è stata scritta systemd ha vinto la guerra pid1 su Linux. Quindi, dovresti probabilmente creare un'unità systemd , se systemd è integrato nella tua distribuzione (che è la maggior parte di loro).

La risposta di seguito è conservata per i posteri.


La risposta del monit sopra è valida, ma ho pensato di menzionare alcune alternative:

Vale la pena ricordare che il sistema operativo ha già risolto il problema di gestione del processo. Tradizionalmente, Linux ha usato sysvinit, che è fondamentalmente la raccolta di script che vedi in init.d. Tuttavia è piuttosto stupido e non può monitorare i processi, gli script init.d sono complicati e vengono sostituiti per una buona ragione.

I sistemi operativi più moderni stanno iniziando a sostituire sysvinit, mentre i sistemi di punta sono Upstart e Systemd. Debian si sta orientando verso systemd, Ubuntu ha sviluppato e praticamente è già passato a Upstart, e come Debian Redhat / CentOS / Fedora si stanno muovendo verso systemd. Pertanto, se si utilizza un sistema operativo che ha già sostituito sysvinit, si consiglia di utilizzare ciò che è incorporato. Gli script sono molto più facili da scrivere rispetto agli script init.

Ho usato runit e mi piace molto, ma il più semplice da usare è il supervisore. È anche molto ben documentato, funziona quasi ovunque ed è confezionato in tutte le principali distribuzioni.

Ma qualunque cosa tu faccia, per favore, per favore, PER FAVORE non usare uno script di shell. Ci sono così tante cose sbagliate in questo approccio!


come farlo con sysvinit?
Horseyguy,

12

iptablesè un cattivo esempio in quanto non è realmente un servizio o un demone in esecuzione, ma parte del kernel. Non puoi davvero "fermarti" iptables, puoi solo dargli una configurazione e "fermarlo" implica dargli una configurazione vuota. In effetti ho avuto un arresto anomalo dei sistemi Linux, ma l'installazione del port forwarding iptablescontinua a funzionare.

Ad ogni modo, un'utilità chiamata monitfarà quello che vuoi. Se stai usando Debian è un apt-get install monitvia. È un po 'complicato da imparare ma molto flessibile.


3

Stiamo usando questo semplice script per fare un avviso e avviare il servizio se non è in esecuzione, puoi aggiungere anche altri servizi ..

 file name: uptime.sh

 #!/bin/bash
 #service monitoring
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^80$ > /dev/null   2>/dev/null
 a=$(echo $?)
 if test $a -ne 0
 then
 echo "http service down" | mail -s "HTTP Service DOWN and restarted now" root@localhost
 /etc/init.d/httpd start > /dev/null 2>/dev/null
 else
 sleep 0
 fi
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^53$ > /dev/null   2>/dev/null
 b=$(echo $?)
 if test $b -ne 0
 then
 echo "named service down" | mail -s "DNS Service DOWN and restarted now" root@localhost
 /etc/init.d/named start > /dev/null 2>/dev/null
 else
 sleep 0
 fi

 Cron setup:
 */5 * * * * /root/uptime.sh > /dev/null 2>/dev/null

Il punto di MariusMatutiae è corretto, ma abbiamo fatto un semplice script per monitorare il servizio HTTPD e DNS nel mio server, funziona bene. Ogni volta che il servizio è inattivo, lo script riavvia il servizio e ci avvisa, riceviamo molti avvisi / e-mail relativi al servizio inattivo, quindi possiamo fare un'indagine su di esso.
Ranjithkumar T,


0

So che sono passati diversi anni da quando è stata posta la domanda. ma con systemd (disponibile principalmente con centos e REHL) è possibile eseguire questo comando bash con cron per verificare e riavviare se il servizio non è attivo.

#!/bin/bash

service=$@
/bin/systemctl -q is-active "$service.service"
status=$?
if [ "$status" == 0 ]; then
    echo "OK"
else
    /bin/systemctl start "$service.service"
fi

salvalo nella tua cartella bin e chiamalo come monitor. Dare il permesso di file appropriato ad esso. quindi eseguirlo come

sudo monitor redis

se si desidera controllare il servizio redis e riavviare / avviare se necessario.

infine aggiungi questo al tuo cron job.

spero che questo possa aiutare


0

Per aggiungere alla lunga lista di supervisione init / svc, come sottodirectory di S6 c'è un nuovo bambino sul blocco, 66, che gestisce la gestione del servizio s6 e la registrazione in modo rapido, leggero e facile da usare. Questo è il link alla documentazione ufficiale per Obarun-Linux https://web.obarun.org/software

Questa è una FAQ su come usare questo software 66 e dare un senso a s6 http://sysdfree.wordpress.com/266

Dalla sua versione stabile è stato trovato un solo bug relativo alle modifiche del kernel da 4.20 a> 5.0, tutti gli altri problemi segnalati avevano a che fare con persone che imparavano qualcosa di nuovo. Se la gestione del servizio dovesse diventare più semplice di così, sarebbe meglio passare a ms-windows (Linus forbid). Per vedere come funziona, basta scaricare un Obarun live.iso e giocarci. I servizi di installazione e i loro 66 script li abilitano, li uccidono, vedono i loro registri, li fermano e li avviano (mentre sono abilitati), raggruppano i servizi in un albero e fanno in modo che gli alberi del servizio si avviino e si fermino tutti insieme, abbiano servizi a livello di utente separatamente dal sistema. Fa quello che s6 fa bene e rende più semplice per l'utente sfruttare il sistema antiproiettile sotto s6.

I download di immagini sono disponibili qui: https://web.obarun.org/index.php?id=74 file di controllo md5 https://repo.obarun.org/iso/

A parte init e la gestione dei servizi s6 / 66 non ha dipendenze da qualsiasi altra cosa sul sistema. È uno strato del sistema di base che lascia il resto del software funzionare autonomamente, init / svc-mgmt cieco. Tutti gli s6 e 66 sono scritti in C e non sono specifici di Linux o specifici di glibc. I server di Skarnet (autori di s6) sono in esecuzione da quasi un decennio senza molte pause sul sistema musl personalizzato. Alpine, Void e Adelie attualmente hanno anche software s6 nei loro repository, Adelie lo utilizza per la supervisione del servizio per impostazione predefinita. Void ora ha anche 66. Non so se e fino a che punto qualcuno abbia portato s6 su xxBSD o altri sistemi xxIX.

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.