2014-04-11 4 views
6

-I-Programm in Go gemacht, die mit syscall.Kill()kann nicht `syscall.Kill()` ein daemonisierte Go Prozess

einen Prozess tötet Aber wenn ich diesen Prozess mit fork() + setsid() daeminze dann ist syscall.Kill() nicht, diesen Prozess zu töten.

Wenn ich Shell kill verwende, dann kann ich diesen Prozess in beiden Fällen beenden.

Ich habe verschiedene Signale ausprobiert: SIGINT, SIGTERM und SIGKILL buthey töten den Daemon nicht.

+0

Überprüfen Sie den Fehler von der sys Anruf? syscall.Kill sollte genau wie kill von der Kommandozeile funktionieren – JimB

+1

Sind Sie sicher, dass Sie Ihr Signal an die richtige PID senden? – kostix

+0

PID ist korrekt. Es wird automatisch aus der 'run.pid' Datei übernommen und' PID' wird auf dem Bildschirm ausgedruckt. Also ist 'PID' korrekt. – Eugene

Antwort

6

a Go Prozess Daemonizing syscalls mit is not currently possible to do reliably und deshalb Ihre Art-of-daemonisierte Prozess unmöglich war, zu töten: es eingekeilt wurde (obwohl ich zugeben, sollte es seltsam ist, warum es nicht als Reaktion gestorben SIGKILL zu senden, die das macht Kernel zerstört nur den Prozess, es wird keine Signalübertragung versucht).

richtig, um ein Go-Prozess eines daemonize wird empfohlen, einen Wrapper-Prozess (wie daemon) oder führen Sie es unter einem fortgeschrittenen Ersatz für die init Superserver wie systemd oder upstart oder ein Standalone-Supervisor wie runit, monit und zu verwenden, andere — in diesem Fall hat der Prozess keine Braindead-Anforderung zu einem echten Unix-Daemon und kann sich wie ein normaler Prozess verhalten: führt keine Doppel-fork + setsid Trickie, nicht mit PID-Dateiverwaltung zu verwirren, ist in der Lage, zu seiner regulären zu schreiben I/O-Streams usw.