Come controllare la frequenza dei riavvii automatici di un servizio runit?


8

Ho questo servizio runit con rune gli log/runscript funzionano correttamente.

In questo caso, il servizio stesso può arrestarsi in modo anomalo per motivi esterni e potrebbe non essere in grado di avviarsi per molti minuti. Il modo predefinito in cui runit gestisce questa situazione è riavviando il servizio ogni paio di secondi. Come cambio questo comportamento?

La mia ultima intuizione è stata quella di aggiungere una checksceneggiatura e fare un po 'di magia lì, ma sembra molto più complicato di quanto dovrebbe essere. C'è un modo migliore e più semplice?

Risposte:


3

Non ho familiarità con questa funzione, tuttavia, se il mio compito era risolvere questo problema, e una lettura della pagina man molto breve non offriva una semplice manopola per ottimizzare questo comportamento, farei quanto segue:

Estendi lo script di avvio del servizio esistente o, se è ingombrante, inserisci un nuovo script di avvio nella catena (che a sua volta avvia lo script di avvio originale). Invece di avviare subito il servizio, il nuovo script di avvio dovrebbe verificare se l'ultimo avvio è avvenuto abbastanza di recente. Questo può essere fatto controllando un file di segnalazione creato dall'avvio precedente. Se il file non esiste, lo script può continuare e toccare il file e avviare il servizio. Se il file esiste, lo script dovrebbe verificare se il file è abbastanza vecchio. Se non è abbastanza vecchio, dovrebbe attendere (sleep) in un ciclo fino a quando il file diventa abbastanza vecchio.

Qualcosa del genere potrebbe funzionare (attende almeno 1 minuto tra i riavvii):

#!/bin/bash

SIGNALDIR=/tmp
SIGNALFILE=service.started

while /bin/true; do
        found=`find "${SIGNALDIR}" -maxdepth 1 -name "${SIGNALFILE}" -mmin -1 | wc -l`
        [ "${found}" -eq 0 ] && break
        echo "Waiting"
        sleep 10
done

touch "${SIGNALDIR}/${SIGNALFILE}"
original service start...

Questo è un buon approccio. Non appena lo collaudo, farò lo script con tutte le possibili correzioni necessarie.
jpbochi,

8

Dovresti limitare i tuoi riavvii nel ./finishfile per quel servizio, che viene eseguito al termine anomalo. Lo ./finishscript riceverà il codice di ritorno da ./rune da lì puoi determinare cosa fare, ecc. In ogni caso, dovresti avere lo ./finishscript che grida ad alta voce sugli errori e invia notifiche e salta tutto in fiamme ...


Grazie questa è la risposta giusta, ma sfortunatamente i programmatori moderni che usano Python, Ruby, ecc. Sembrano sempre scrivere app che non prestano attenzione ai segnali unix e non forniscono affatto i codici di uscita adeguati.
figtrap

1
I codici di errore restituiti apparentemente sono "non freddi", credo?
Avery Payne,

sembra così. Penso che sia un grande passo indietro, me stesso.
figtrap

1

Non sono un fan della gestione dei processi basata su init (e runit è sostanzialmente un sostituto di init). Come stai scoprendo, il riavvio semplice di processi falliti non appena muoiono non è una strategia particolarmente buona. Ho usato init per riavviare il monit, ma questo è il massimo. (potenzialmente il killer OOM potrebbe uccidere il monit).

Quindi, ti incoraggio a cercare un sostituto anziché rimediare.

Monit è piuttosto vecchio, ma fa bene il lavoro, e non sono a conoscenza di qualcosa di meglio che è successo. Ha la bella caratteristica di non aver bisogno di mallocare più memoria dopo l'avvio, quindi batte l'inferno di qualsiasi cosa scritta in un linguaggio di scripting. L'ultima cosa che vuoi è che il tuo monitor di processo muoia perché non riesce a ottenere memoria.


systemd, incluso in EL7 e nella maggior parte delle altre distribuzioni, può gestire nativamente questa situazione e una varietà di situazioni simili con un numero enorme di opzioni e rende i gestori di processo come questi obsoleti.
Michael Hampton,

1
Esistono poche situazioni in cui systemd potrebbe essere "troppo grande" per l'ambiente di destinazione. E il vecchio metodo di "gestione dei processi riavviando fino a quando non viene eseguito" è stato in gran parte sostituito da una corretta risoluzione delle dipendenze. Vedi skarnet.org/software/s6-rc e jjacky.com/anopa per esempi.
Avery Payne,
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.