2012-11-12 1 views
9

Abbiamo circa 40 computer con hardware e software identici. Tutti eseguono Ubuntu 11.10. Hanno tutti un solo account utente per accedere. Il file .profile è impostato per avviare un processo demone. Il codice per il demone è scritto in C.Cosa può causare la generazione di SIGHUP?

Una volta in poche settimane, si ottiene un report che il demone non è più in esecuzione. Questo non succede su tutti i computer ma solo uno o due. Non possiamo riprodurre il problema in modo coerente.

Guardando il codice, l'applicazione si chiude quando riceve SIGHUP o SIGTERM.

Come ho capito, SIGHUP viene generato quando un utente si disconnette. Nel nostro caso, l'utente non si disconnette mai. Mi chiedo se sia possibile che SIGHUP sia stato generato per qualche altra ragione. Qualsiasi altro pensiero sarebbe apprezzato.

+0

hai provato ad accedere al demone per vedere quale dei 2 segnali se ce l'hanno? SIGHUP sembra essere attivato se il terminale di controllo è chiuso, ma se si utilizzano build server e solo la connessione 1 principale, suppongo che la differenza sia immediata. –

+0

I segnali possono anche essere inviati manualmente. Chissà? – arkascha

risposta

7

I segnali possono essere inviati utilizzando l'utilità kill o kill syscall. Ovviamente, puoi provare a scoprire chi sta inviando quel segnale o disconnettendo i tuoi terminali o le connessioni di rete, ma c'è un modo più semplice e pratico per risolvere il tuo problema.

Quando il codice dovrebbe funzionare come un demone, ma in realtà non lo è (proprio come il tuo), c'è un wrapper che può trasformare qualsiasi programma in daemon. Sorpresa: questo wrapper si chiama daemon! Ha molte opzioni, probabilmente la cosa più importante per te, possibilità di riavviare automaticamente la tua utility se dovesse mai morire per qualsiasi motivo.

Se questo comando non è installato su Ubuntu, solo sudo apt-get install daemon e man daemon per iniziare.

+1

e c'è anche la funzione di libreria 'daemon (3)'. –

+0

Grazie per il vostro aiuto. Il codice è scritto per essere eseguito come demone (usando fork, setsid, ecc.). Tuttavia, esaminerò anche lo strumento daemon esterno. – Peter

11

Bene, ci sono un paio di cose da notare su SIGHUP. In primo luogo, la sua origine deriva dal concetto di un Hangup, cioè la perdita di connessione a una console su qualcosa come un modem. Nel gergo moderno questo significa generalmente che ha perso il controllo di tty. A meno che tu non abbia avuto cura di staccare dal tuo tty qualsiasi programma avviato in un dato terminale riceverà un SIGHUP quando il terminale è chiuso. Vedi here per i dettagli su come farlo nel tuo programma. Altre opzioni includono:

  • esecuzione del programma all'interno di '' schermo '' o '' tmux ''
  • eseguire il programma con '' nohup '' o qualche altro quadro daemonising

L'altro La possibilità è che qualcosa sta deliberatamente inviando il tuo processo a SIGHUP che è per "tradizione" che viene spesso utilizzato per segnalare un processo che dovrebbe rileggere la sua configurazione.