Come supervisionare e riavviare automaticamente un processo?


34

Voglio avere un processo che verrà riavviato se si blocca. Ho cercato su google un po 'e ho scoperto che una soluzione semplice è usare i daemontools .

Non ho capito come configurarlo.

  1. Qual è il modo più semplice per realizzare tale funzionalità?
  2. Come configurarlo?

Risposte:


29

Questa risposta si applica alle versioni di Ubuntu con Upstart (<= 14.10). Utilizzare un altro approccio per le versioni con Systemd (> = 15.04).

Sembra che tu stia cercando una funzionalità già fornita in Ubuntu con Upstart . La respawnstanza nella configurazione farà esattamente ciò di cui hai bisogno. Vorrei sconsigliare l'uso di un modo meno standard di affrontarlo.

Senza ulteriori dettagli sul processo che stai cercando di gestire, è difficile dire come dovrebbe essere la configurazione. Dipende se si biforca e si mette in secondo piano, ad esempio. La documentazione di Upstart sulla respawnstanza dovrebbe darti maggiori informazioni.

Sfortunatamente, non è ancora possibile eseguire correttamente i lavori utente: impossibile avviare per eseguire il lavoro utente

Esempio

Supponiamo di voler mantenere in funzione l'app Calcolatrice, anche quando viene uccisa a fuoco (segnale 9).

  1. Crea un file di configurazione in /etc/init/calculator.conf(basato su questo articolo ):

    #!upstart
    description "Calculator"
    
    # Start job via the daemon control script. Replace "gert" with your username.
    exec su -l gert -c 'export DISPLAY=:0; /usr/bin/gnome-calculator'
    
    # Restart the process if it dies with a signal
    # or exit code not given by the 'normal exit' stanza.
    respawn
    
    # Give up if restart occurs 10 times in 90 seconds.
    respawn limit 10 90
    
  2. Inizia correndo

    sudo start calculator
    
  3. Si apre sul display corrente ( :0) e goditi la bellezza vedendolo riavviare dopo averlo chiuso.

    • Identificare l'ID del processo, ad es. Eseguendo ps aux | grep calculator:

      gert  13695 0.2 0.4 349744 16460 ?   Sl   13:38   0:00 /usr/bin/gnome-calculator
      
    • Uccidilo col fuoco.

      sudo kill -9 13695
      
    • Guardalo riapparire:

      gert  16059 4.6 0.4 349736 16448 ?   Sl   13:40   0:00 /usr/bin/gnome-calculator
      

Si noti che questo sarà più elegante con i piani per i piani Ubuntu 13.04 con il corretto supporto dei lavori utente.


Ricevo un lavoro sconosciuto quando provo ad avviarlo? qualsiasi ideea. ho inserito il file in / etc / init
opc0de il

@ opc0de Il nome del file servicename.confdeve corrispondere al comando per iniziare start servicename. Sospetto che tu abbia scelto un nome diverso.
gertvdijk,

no, corrisponde ma non ho seguito il tuo esempio quindi penso che potrei avere un errore di sintassi.
opc0de,

@ opc0de Bene, inizia spiegando di più su ciò che stai cercando di realizzare nella domanda: quale tipo di applicazione / processo e come lo esegui, ad esempio, nonché i dettagli sul tuo attuale tentativo.
gertvdijk,

Risolto con il tuo esempio il mio errore è stato che probabilmente ho avuto un errore nello statuto esecutivo. Grazie per l'aiuto!
opc0de,

13

Uno strumento estremamente semplice che può ottenere lo stesso effetto senza necessità di configurazione è immortal: https://immortal.run/

Esegui semplicemente il comando in questo modo:

immortal <cmd>

Funzionerà in background e si riavvierà automaticamente se esce.

  • immortalctl: Visualizza lo stato dei lavori in esecuzione. C'è una namecolonna che verrà stampata qui, puoi usarla per fare riferimento al lavoro con altri comandi di controllo.
  • immortalctl stop <name>: Interrompe il monitoraggio del lavoro con il nome specificato (non verrà riavviato automaticamente, ma il processo corrente continuerà a essere eseguito)
  • immortalctl -k <name>: Invia SIGKILL al processo corrente.
  • immortalctl exit <name>: Interrompe il monitoraggio del lavoro con il nome specificato e lo rimuove dall'elenco dei lavori.

1
Grazie, ha funzionato benissimo per il mio caso d'uso in 16.04. Mettendo questo nella mia borsa di strumenti utili.
Quentin Skousen,

2
In effetti, questo sembra più leggero di upstart / respawn.
Sridhar Sarnobat,

C'è un modo per farlo visualizzare stdoute stderrin primo piano?
David S.

Non ne sono consapevole, dal momento che di solito viene utilizzato per eseguire un processo in background. Tuttavia, è possibile utilizzare immortalctl -l out.log <cmd> && tail -f out.logper ottenere lo stesso effetto.
motore extropic

@DavidS. potresti ottenere un registro combinato o avere stdout e stderr immortal.run/post/stderr
nbari

1

Se non hai bisogno della funzionalità daemon / servizio / processo in background e vuoi semplicemente farlo nella console, crea un file chiamato autorestart.sh :

#!/bin/bash

while [ 1 ]; do
  some_command
done

Poi ./autorestart.sh si riavvierà automaticamente some_commandse esce o si arresta in modo anomalo. CTRL-C interrompe il ciclo e chiude il programma in modo pulito.

Testato su Ubuntu 18.04.


0

C'è un modo senza "Upstart". La parola chiave è "inittab" :-). Sebbene si tratti di un file che di solito non viene modificato dal valore predefinito, può essere utilizzato per ottenere la rigenerazione desiderata sui computer SYSV.


Non capisco perché qualcuno abbia rifiutato questa soluzione. Se non lo capisci, basta cercarlo su Google; è inutile tagliare e incollare qui le pagine man di initttab, puoi leggerle tu stesso sul tuo sistema! basta digitare "man inittab" ...
cepal67,

13
Le risposte di alta qualità descrivono più di "usa questo, capiscilo da solo" :)
Seth

0

ps-watcher è uno strumento che controlla quali processi sono in esecuzione ed esegue un'azione in determinate circostanze. Installiamolo:

apt-get install ps-watcher

Per i dettagli, vedi la parte inferiore di Running HHVM con fallback a PHP-FPM : per me ha funzionato bene.


Poiché non è molto lungo, aggiungi un riepilogo del codice anziché dell'articolo perché solo una sezione molto breve si applica a questa domanda.
derHugo,

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.