Il modo migliore per fare un hook di spegnimento?


9

Dal momento che Ubuntu si affida all'avvio da qualche tempo, vorrei utilizzare un processo di avvio per arrestare con grazia determinate applicazioni allo spegnimento o al riavvio del sistema. È essenziale che l'arresto o il riavvio del sistema sia bloccato fino allo spegnimento di queste applicazioni.

Le applicazioni verranno avviate manualmente occasionalmente e allo spegnimento del sistema dovrebbe essere automaticamente terminata da uno script (che già ho). Poiché le applicazioni non possono essere terminate in modo affidabile senza (quasi tutti) altri servizi in esecuzione, è necessario terminare le applicazioni prima che inizi il resto dell'arresto.

Penso di poterlo risolvere con un processo di avvio che verrà attivato all'arresto, ma non sono sicuro di quali eventi dovrei usare in che modo. Finora ho letto le seguenti dichiarazioni (in parte contraddittorie):

  • Non vi è alcun evento di arresto generale in avvio
  • Utilizzare una stanza come start on starting shutdownnella definizione del lavoro
  • Utilizzare una stanza come start on runlevel [06S]nella definizione del lavoro
  • Utilizzare una stanza come start on starting runlevel [06S]nella definizione del lavoro
  • Utilizzare una stanza come start on stopping runlevel [!06S]nella definizione del lavoro

Da queste raccomandazioni sorgono le seguenti domande:

  • C'è o non c'è un evento di spegnimento generale nella fase iniziale di Ubuntu?
  • Qual è il modo consigliato per implementare un "hook di spegnimento"?
  • Quando vengono attivati ​​gli eventi runlevel [x]; è questo quando si è entrati nel runlevel o quando si entra nel runlevel?
  • Possiamo usare qualcosa di simile start on starting runlevel [x]o start on stopping runlevel [x]?
  • Quale sarebbe la soluzione migliore per il mio problema?

Grazie mille

Risposte:


2

startinge runlevelsono eventi separati, quindi non puoi dirlo in modo significativo starting runlevel N.

L' runlevel Nevento viene emesso all'inizio dell'accesso al runlevel. Se start on runlevel Nquindi l'attività viene eseguita all'entrata. La modalità di esecuzione al termine dell'accesso al runlevel è run on started rc RUNLEVEL=N.

A quanto ho capito, devi start on runlevel [06S]fare quello che vuoi; in teoria dovrebbe funzionare prima che qualsiasi altra cosa venga fermata. Per un controllo più preciso, è possibile utilizzare in start on stopping apache or stopping mysql or ...modo che l'attività venga eseguita prima che uno di essi venga chiuso.


Modificato per cambiare il runlevel 5 in S.


1
Inoltre, l'unica ragione per cui esiste un startupevento distinto è che è necessario qualcosa per "adescare la pompa". Dopo che un evento privilegiato viene inviato, tutto il resto può essere ed è definito dai lavori e dalle attività attivati ​​da startup. Per quanto riguarda il fatto che non ci sia un singolo shutdownevento, ci sono troppi tipi diversi di shutdownquello per essere significativo. Meglio dipendere direttamente dai lavori che devi avere in esecuzione.
Geekosaur,

Grazie mille. Accetto con gratitudine la tua risposta poiché risponde alle mie domande e risolve il problema. Tuttavia, ho un'altra domanda / commento (che non è correlato a un problema): AFAIK, l'obiettivo iniziale è quello di sostituire completamente il concetto di runlevel. Il fatto che dobbiamo fare affidamento sui runlevel per ottenere un gancio di spegnimento globale contraddice questo obiettivo. Penso che upstart dovrà presentare un evento del genere. Comprendo chiaramente che sarebbe meglio dipendere dai lavori di cui abbiamo davvero bisogno, ma d'altra parte, nel mio caso, ci sono un sacco di lavori ... continua ...
Binarus

(quasi tutto ciò che è in esecuzione), e non oso nemmeno pensare a scoprire la relazione tra i processi in esecuzione sulla scatola (ps -Alf) e i lavori che controllano questi processi; di sicuro non esiste una relazione 1: 1. Esistono lavori che non sono correlati ad alcun processo (ad esempio, la configurazione della rete), e suppongo che ci siano abbastanza processi che non sono comunque correlati ad alcun lavoro e specialmente all'avvio manuale.
Oli

Upstart ha sostituito i runlevel hardcoded ; per quanto posso determinare, il concetto di runlevel non sta andando via, è ora definito nello spazio utente. Se sei preoccupato per un periodo così lungo, allora vuoi usare il mio ultimo suggerimento di correre on stopping servicea or stoping serviceb or ...per qualunque servizio tu abbia bisogno.
Geekosaur,

-1 per diverse imprecisioni. Completamente, questo in realtà non funzionerà. stop on iniziato rc RUNLEVEL = [016] non è diverso da 'stop on runlevel [016]'. Questo perché nessuno dei due eventi bloccherà la chiusura. Esiste anche una sintassi non valida, poiché "run on" non è valido. Tutto sommato, questo confonde il problema, in realtà non aiuta. Mi dispiace che sia così tardi! Sto solo rivedendo le vecchie risposte.
SpamapS

2

Per impedire che l'arresto continui mentre il lavoro si interrompe, ti consigliamo di utilizzare questo:

stop on starting rc RUNLEVEL=[016]

Questo funzionerà perché viene emessa la prima cosa che si verifica quando si digita 'shutdown' è tunlevel 0. rc inizia sul runlevel e la transizione da arrestato -> avvio si bloccherà completamente fino a quando tutti i lavori che devono anche cambiare stato non completano quello stato.

Ti consigliamo di assicurarti che il tuo processo risponda rapidamente a SIGTERM. Se non risponde entro 5 secondi, upstart lo invierà SIGKILL. Puoi aumentarlo con "kill timeout X".

L'1 lì dentro, a proposito, è un po 'complicato, è necessario assicurarsi che il tuo avvio includa qualcosa che inizia sul runlevel [2345] a quel punto, in modo che un utente che scende per la manutenzione in modalità utente singolo riprenda il suo lavoro. Fortunatamente molto lavoro è stato fatto per rendere questo il solito inizio suggerito

start on runlevel [2345]

Inoltre, in alcuni casi è necessario qualcosa per continuare a funzionare fino a quando la rete non viene interrotta (come dbus / network-manager). Per quello che vuoi

stop on deconfiguring-networking

Si tratta di un evento emesso in seguito all'arresto che verrà bloccato anche fino a quando tutti i lavori che lo utilizzano non completano completamente le loro transizioni nello stato.


Intendi dire che start on starting ... non ha molto senso che il mio gancio di arresto si fermi su qualsiasi cosa. start on starting rc RUNLEVEL=[016]avrebbe molto più senso. E forse un tasklancio lì dentro per assicurarsi che possa completarsi prima che altre cose corrano.
Tejay Cardon,

0

Geekosaur, grazie mille per il tuo aiuto.

Nel frattempo, ho provato il start on runlevel [016]metodo, ma non ha funzionato e penso di capire perché:

Il lavoro è stato effettivamente avviato, ma il processo di arresto non è stato bloccato fino al completamento dell'attività del lavoro. Sono abbastanza sicuro ora che gli eventi startinge stoppingsono gli unici eventi che possono essere utilizzati in una definizione di lavoro per bloccare altri lavori, e penso che questo sia ciò che i manuali di Upstart provano a dirci. Pertanto, l'utilizzo dell'evento runlevel non porterà mai al blocco di altri lavori o al processo di arresto; quindi, è inutile per il mio scopo.

Invece, mi sembrano avere due possibilità:

  1. Seguendo una delle tue proposte, scopri tutti i lavori di cui hanno bisogno le applicazioni ripetitive e includili tutti nell'evento iniziale per lo script in questo modo:

    start on stopping job1 or stopping job2 or ...
    

    Questo è così tanto lavoro che sto seriamente pensando di scaricare l'elenco dei lavori ed eseguirlo attraverso sed per produrre automaticamente una stanza iniziale per il mio lavoro che include tutti i lavori che normalmente sono in esecuzione sul sistema.

    Il vantaggio sarebbe che le rispettive applicazioni verrebbero chiuse anche quando qualcuno interrompesse manualmente uno dei prerequisiti (invece di fermarli con una modifica / arresto / riavvio del runlevel).

  2. Trova l'unico lavoro che verrà interrotto all'inizio al riavvio / spegnimento del sistema (chiamiamo questo lavoro "FirstJob") e utilizzalo in una stanza come:

    start on stopping FirstJob
    

    Gli svantaggi principali sarebbero che non so se esiste un lavoro del genere e se quel lavoro dipende davvero da tutti gli altri lavori da cui dipende effettivamente l'applicazione ripetitiva ("dipende da altri lavori" in questo caso significa "verrà interrotto completamente prima che altri lavori inizino a fermarsi ").

Non sono sicuro di quale delle due possibilità sia la migliore ...


Farei la sedsceneggiatura proprio ora, se fossi nei tuoi panni.
geekosaur,
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.