Domanda

Ho un servizio, diciamo foo, scritto in C ++, che funziona come root. C'è il solito script, /etc/init.d/foo start | stop | restart.

In certi momenti, foo ha bisogno di ricaricarsi. Normalmente dopo che un aggiornamento è terminato. Ma fare cose come:

system("/etc/init.d/foo restart")

non funziona dal momento in cui il riavvio uccide foo, anche la chiamata system () viene ovviamente uccisa e lo script di riavvio non viene mai eseguito fino al completamento.

C'è un'altra chiamata che posso usare al posto di system () che funziona in modo asincrono come fratello del processo di chiamata, invece di creare un figlio sincrono?

Grazie!

È stato utile?

Soluzione

Hai già preso in considerazione la famiglia exec [*] ? Eccone uno: execute .

Altri suggerimenti

Potresti metterlo in inittab e lasciare che init si preoccupi di riavviare il processo quando termina per qualsiasi motivo. Ciò si occuperebbe anche del riavvio automatico in caso di arresto anomalo o asserito del processo () o di chiusura inaspettata.

Quindi, per gestire il tuo caso d'uso, il processo terminerebbe semplicemente da solo.

che ne dici di fork () seguito da exec ()?

Prendi in considerazione l'implementazione

/etc/init.d/foo reload

per il tuo demone (piuttosto standard a giudicare da un grep del mio box Debian).

Questo in genere viene fatto inviando al processo un segnale SIGHUP; il demone dovrebbe avere un gestore di segnale che catturi questo e ricarica qualsiasi configurazione.

Se il processo sa che deve essere ricaricato, può semplicemente segnalarsi.

Se hai davvero bisogno di riavviare per raccogliere nuove librerie, vai con exec*()

Combinando le due risposte finora, usa un fork-exec .

Per aggiungere ciò che Ori ha già detto, alcune distro Linux usano ancora initab, ma Ubuntu e forse altri sono passati a /etc/event.d. Inserisci un file (copia e modifica uno di quelli esistenti) quindi avvia il demone con " sudo start ssh_tunnel " o come si chiama il tuo file.

Quindi, quando ti serve per riavviarlo, puoi semplicemente ucciderlo con un segnale e il sistema lo riavvierà. Oppure potrebbe decidere da solo che è il momento di riavviare, chiamando " exit (0); " o qualsiasi altra cosa.

exec * () da solo sulla riga di comando originale dovrebbe fare il trucco. Probabilmente puoi omettere il fork, `perché allora hai due copie in esecuzione di cui non hai bisogno e la copia originale deve quindi uscire.

Ma guarda anche inittab ed event.d a seconda della tua distribuzione, per vedere se farà ciò di cui hai bisogno in un modo migliore.

Una terza possibilità a ciò che Ori e Paul hanno suggerito sarebbe quella di usare i demonoli. È più portatile sebbene meno probabile sia disponibile. Crei uno script chiamato / service / foo / run e daemontools rigenererà il tuo servizio ogni volta che esce.

http://cr.yp.to/daemontools.html

Guarda la pagina man di inittab.

Descrive come il sistema riavvierà automaticamente i processi se muore (respawn).

Con questa configurazione corretta tutto ciò che il tuo servizio deve fare è uscire e il sistema si prenderà cura del riavvio (rigenerazione) per te in modo automatico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top