Il modo standard o migliore per mantenere attivo il processo avviato da init.d


14

Sto cercando un modo standard o le migliori pratiche per mantenere init.dvivo un demone avviato da uno script di shell.

O ancora meglio, c'è un modo per tenerlo in vita direttamente da /etc/init.d?

In particolare, ho un demone chiamato dtnd con e ciclo infinito che cerca un processo inaspettato, se ce ne sono, il demone li sveglia di nuovo. Inoltre, utilizzo lo strumento start-stop-daemon per consentire l'esecuzione della precessione da un determinato utente di sistema.

Voglio eseguire questo demone dtnd all'avvio. Per raggiungere questo comportamento ho creato uno script init.d che "avvolge" il file dtnd usando i comandi start, stop e status.

Ho 2 domande che mi piacerebbe risolvere:

  1. Esiste un modo per mantenere vivo qualche processo dallo script shell init.d. È una pratica standard / migliore?

  2. Si consiglia di mantenere in vita un processo con loop infinito? Immagino sia meglio usare alcuni comandi come respawnper ottenerlo. È corretto?

So dell'esistenza del respawncomando. Penso che sia quello di cui ho bisogno ma non capisco il flusso di lavoro tra /etc/init.d/e /etc/init. Qualcuno può aiutarmi?

Si noti che non ho né inittab upstart (mi è permesso solo l'uso /etc/init, /etc/init.d, crone strumenti di sistema come start-stop-daemon. Voglio dire, solo gli strumenti di default)

Grazie mille per il tuo tempo!


Risposte:


13

Debian alla fine avrà systemd, quindi questo è il modo di farlo su un sistema Linux che usa systemd (e molti già lo fanno; potresti considerare di cambiare le distribuzioni).

Systemd è in grado di gestire automaticamente il servizio attivo per te; non sono richiesti altri strumenti. Assicurati semplicemente che Restart=alwayssia impostato nella [Service]sezione del file di servizio .

# vi /etc/systemd/system/dtnd.service

[Service]
Restart=always
#...everything else...

Sono disponibili anche molte altre opzioni , per scenari più complessi.


2
Mentre il futuro mostra opzioni più flessibili, questo si occupa dell'ambiente o delle condizioni attuali? L'installazione di uno strumento sembra essere il percorso di minor resistenza rispetto a una modifica / aggiornamento della distribuzione del carrello elevatore.
ewwhite,

@ewwhite Dipende. Debian ha systemd da wheezy, ma non era l'init predefinito. Dovrebbe essere l'impostazione predefinita da Jessie. E poiché il nostro utente ha accettato la risposta, presumo che stesse già utilizzando systemd per un altro motivo (o avesse il permesso di installarlo).
Michael Hampton

systemdsembra scartare la init.dsceneggiatura e basarsi su*.service
yurenchen il

2
Invece di modificare direttamente usa il più sicuro systemctl edit myservice, quindi systemctl daemon-reloadriavvia myservice.
Pablo A

@PabloBianchi La creazione di una sostituzione va bene se si esegue la sostituzione di un'unità di servizio esistente. Se stai creando un'unità da zero, come ha fatto l'OP, allora è inutile.
Michael Hampton

3

Puoi aggiungerlo a /etc/inittabcon respawn:

d1:2345:respawn:/path/to/your/first_daemon arg1 arg2
d2:2345:respawn:/path/to/your/second_daemon arg1 arg2

È un trucco sporco, ma l'ho usato con successo in passato su vecchi sistemi sysv-init.


Ma i demoni non chiamano mai setsid () e fork () per essere eseguiti in background?
symcbean,

Grazie! Come dici tu è un trucco sporco ma funziona. Comunque preferisco l'uso di systemd. Ora ne so l'esistenza.
Adrian Antunez,

Questo non funziona su RHEL6. L'utilità di rigenerazione non sembra essere disponibile.
Djidiouf,

2

Bene, questo è uno dei motivi principali per cui debian sta passando a systemd.

sysvinit (/etc/init.d) non è in grado di rilevare se un servizio è inattivo / non risponde. Ciò significa che devi monitorare questi servizi e inoltrare se un servizio non farà più il suo lavoro.

probabilmente la cosa più semplice da fare sarebbe migrare verso un altro demone come Systemd (predefinito in RHEL7, sarà predefinito nei prossimi debian e ubuntu lts), upstart (predefinito in RHEL6, Ubuntu 12.04 e 14.04), daemontools (come detto, sviluppato da djb) o qualcos'altro.

fare il lavoro di mantenere vivo un servizio sarà PITA in sysvinit.


1

La migliore pratica è assicurarsi che i tuoi demoni NON FERMANO in primo luogo.

In caso contrario , potresti dare un'occhiata ai demonoli di DJB


3
Naturalmente la migliore pratica è assicurarsi che i miei demoni non si fermino. Ma ci sono molte applicazioni che seguono l'approccio if-I-stop-wake-me come apache2, mysql, samba, pulseaudio ... Ho cercato demoni e sembra un buon approccio. Sfortunatamente, non mi è permesso installare strumenti esterni. Devo farlo usando script bash o start-stop-daemon e init.d configs.
Adrian Antunez,

1

L'approccio standard per me è usare l' utilità Monit per questo.

Non riesco a capire dalla tua descrizione se hai scritto qualcosa come Monit e stai cercando di assicurarti che funzioni, o se hai bisogno di qualcosa per guardare il demone che hai creato.


1
Ciao ewwhite, devo assicurarmi che la mia applicazione sia in esecuzione. Sfortunatamente, non mi è permesso installare strumenti esterni. Devo farlo usando script bash o start-stop-daemon e init.d configs.
Adrian Antunez,

2
@ AdriánAntúnez Se non ti è permesso installare gli strumenti necessari per svolgere il tuo lavoro, dovresti risolvere il problema il prima possibile.
Michael Hampton

@ AdriánAntúnez Hai chiesto "standard". Monit è piuttosto noto / apprezzato. Hai chiesto il "migliore" ... Il tuo vincolo è più di tipo politico. Perché non ti è permesso installare software?
ewwhite,

1
Non è uno strumento o una dipendenza non necessari se fa quello che vuoi che faccia .
ewwhite,

1
@ewwhite Siamo spiacenti, intendevo evitare dipendenze di strumenti esterni.
Adrian Antunez,
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.