2014-04-11 14 views
6

ho fatto programmi in Go che uccide un processo con syscall.Kill()Impossibile `syscall.Kill()` un processo Go daemonized

Ma se io daeminze quel processo con fork() + setsid() poi syscall.Kill() non uccide quel processo.

Se utilizzo la shell kill, sono in grado di interrompere il processo in entrambi i casi.

Ho provato diversi segnali: SIGINT, SIGTERM e SIGKILL ma non uccidere il demone.

+0

Stai verificando l'errore dal sistema chiamata? syscall.Kill dovrebbe funzionare come kill dalla riga di comando – JimB

+1

Sei sicuro che stai inviando il tuo segnale al PID giusto? – kostix

+0

Il PID è corretto. Viene automaticamente preso dal file 'run.pid' e' PID' viene stampato sullo schermo. Quindi 'PID' è corretto. – Eugene

risposta

6

Daemonizing un processo Go utilizzando chiamate di sistema is not currently possible to do reliably ed è per questo il vostro sorta-di-daemonized processo era impossibile uccidere: è stato incastrato (anche se ho dovuto ammettere che è strano perché non è morto in risposta all'invio SIGKILL che rende il il kernel distrugge semplicemente il processo, non viene tentata la consegna del segnale).

Per demonizzare correttamente un processo Go uno si consiglia di utilizzare un processo di involucro (come daemon) o eseguire sotto un sostituto avanzato per l'init Superserver come systemd o upstart o un supervisore indipendente, come runit, monit e altri — in questo caso il processo non ha bisogno di essere un vero daemon Unix e può comportarsi come un normale processo: non esegue doppio fork + setsid inganno, non fa casino con la gestione dei file PID, è in grado di scrivere regolarmente Streaming I/O, ecc.