Qual è il modo giusto di riavviare i servizi dipendenti durante l'installazione del pacchetto?


10

Sto creando un pacchetto di configurazione e vorrei interrompere e riavviare i servizi la cui configurazione è interessata. In questo momento sto usando la service [stop|restart]in {pre,post}{inst,rm}modo. Ho letto in una domanda da qualche parte che invoke-rc.dè il modo giusto , perché onora le preferenze dell'utente su un servizio. Tuttavia, non sono riuscito a trovare linee guida in merito. Qualcuno sa di tali linee guida? O hai qualche consiglio su come scegliere? Il pacchetto è di uso interno e probabilmente sarà solo per 14.04 per i prossimi due anni. Tuttavia, vorrei lasciare uno stato il più pulito possibile per il mio successore, quindi lo systemdè anche nella mia mente.

Dalla invoke-rc.dpagina man :

Tutti gli accessi agli script init da parte degli script del manutentore dei pacchetti Debian dovrebbero essere fatti tramite invoke-rc.d .

Dal Debian Policy Manual, Capitolo 9, Sezione 3.3 :

I manutentori dovrebbero usare il livello di astrazione fornito dai programmi update-rc.d e invoke-rc.d per gestire gli initscripts negli script dei loro pacchetti come postinst, prerm e postrm.

...

Gli script del manutentore del pacchetto devono utilizzare invoke-rc.d per richiamare gli initscripts /etc/init.d/*, invece di chiamarli direttamente.

Debian ha usato sysv-inite passerà direttamente a systemd, e suppongo che il manuale delle politiche sarà aggiornato a tempo debito per fare riferimento systemctl. Tuttavia, ciò di cui non sono sicuro è questo: dovrei usare invoke-rc.dinvece di service? Posso dire dpkgche sono interessato ad alcuni file (tramite trigger), quindi c'è un modo per dire dpkgche sono interessato anche ad alcuni servizi e iniziare dpkga riavviare / ricaricare?

Per chiarire: non sto scrivendo script init. Sto fornendo un pacchetto con la configurazione per altre applicazioni, come Puppet, NTP, ecc., Quindi interrompo e riavvio i servizi corrispondenti negli script.

Qui , per esempio, è una questione Docker su invoke-rc.dvs service. Il problema è ancora aperto, con una persona, probabilmente un manutentore, che commenta che sono sicuramente interessati a farlo nel modo giusto - chiaramente nessuno di noi è sicuro di cosa si tratti. (La mia domanda è indipendente da quel problema.)

Risposte:


5

Continuerei a usare gli script pre / post inst,

preinst - Questo script viene eseguito prima che quel pacchetto venga decompresso dal suo file di archivio Debian (".deb"). Molti script "preinst" interrompono i servizi per i pacchetti che vengono aggiornati fino al completamento dell'installazione o dell'aggiornamento (a seguito della corretta esecuzione dello script "postinst").

postinst - Questo script in genere completa qualsiasi configurazione richiesta del pacchetto foo una volta decompresso foo dal suo file di archivio Debian (".deb"). Spesso, gli script 'postinst' chiedono input all'utente e / o avvisano l'utente che se accetta valori predefiniti, dovrebbe ricordarsi di tornare indietro e riconfigurare quel pacchetto quando la situazione lo richiede. Molti script "postinst" eseguono quindi tutti i comandi necessari per avviare o riavviare un servizio dopo l'installazione o l'aggiornamento di un nuovo pacchetto.

vedi - https://www.debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html

La sintassi del richiamo di start | stop | restart è scritta come condizionale, vedere https://www.debian.org/doc/debian-policy/ch-opersys.html sezione 9.3.3.2 Esecuzione di initscripts

se quale invoke-rc.d> / dev / null 2> & 1; poi

pacchetto invoke-rc.d

altro

/etc/init.d/package

fi

così ...

if which service >/dev/null 2>&1; then
        service package <action>
elif which invoke-rc.d >/dev/null 2>&1; then
        invoke-rc.d package <action>
else
        /etc/init.d/package <action>
fi

e aggiungere un altro condizionale per systemd quando necessario;)

Quindi sì, il modo corretto di avviare | stop | riavvia un servizio è con lo script wrapper appropriato (invoke-rc.d / system), quando possibile, piuttosto che chiamare lo script init (/etc/init.d/package) e ricadendo nello script /etc/init.d quando non è disponibile alcun wrapper.


Questo risponde praticamente alla maggior parte dei miei dubbi, tranne uno. La invoke-rc.dpagina man e i documenti della politica Debian ci dicono di usarla in relazione agli /etc/init.d/script (probabilmente perché hanno ancora usato sysv-init). Come cambia con Upstart o systemd?
muru,

Aggiorna la tua domanda o pubblica un link alle informazioni che stai leggendo. Non ho visto nulla nella pagina man sull'imballaggio. Suppongo che dipenda dal tuo servizio e dallo script di init (è upstart? Systemd?) Stai chiedendo su askubuntu.com e ubuntu usa upstart, quindi askubuntu.com/questions/58404/how-to-start-and-stop -un servizio . Se il pacchetto utilizza un vecchio script init, dovrebbe essere convertito in upstart per ora e systemd nel lungo periodo.
Pantera

Ho aggiornato la domanda.
muru,

Non esiste una risposta semplice o semplice alla domanda in quanto "dipende". Si tratta di una situazione un po 'temporanea, poiché andare avanti Ubuntu e Debian utilizzeranno entrambi systemd. Dovresti usare invoke-rc.d per i servizi su Debian (o Ubuntu) che usano sysv-init e service ... su Ubuntu per i servizi che usano upstart. È uno scripting, quindi sii creativo se necessarioinvoke-rc.d ... || service ...
Panther

Pensavo che ti chiedessi se dovessi usare gli script pre / post inst, non la sintassi del tuo script.
Pantera

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.