2014-04-11 14 views
6

zrobiłem program w Go, który zabija proces z syscall.Kill()Nie można `syscall.Kill()` a daemonized proces Go

Ale gdybym daeminze ten proces z fork() + setsid() następnie syscall.Kill() nie zabić ten proces.

Jeśli użyję powłoki , to jestem w stanie zabić ten proces w obu przypadkach.

Próbowałem różnych sygnałów: SIGINT, SIGTERM i SIGKILL buthey nie zabijają demona.

+0

Czy sprawdzasz błąd z sys połączenie? syscall.Kill powinien działać tak jak zabij z linii poleceń – JimB

+1

Czy jesteś pewien, że przesyłasz swój sygnał do właściwego PID? – kostix

+0

PID jest poprawny. Jest on automatycznie pobierany z pliku 'run.pid', a' PID' jest drukowany na ekranie. Więc 'PID' jest poprawny. – Eugene

Odpowiedz

6

Daemonizing proces Go przy użyciu wywołań systemowych is not currently possible to do reliably i dlatego Twój sort-of-daemonized procesu było niemożliwe do zabicia: został zaklinowany (choć muszę przyznać, że to dziwne, dlaczego nie umarł w odpowiedzi do wysyłania SIGKILL co sprawia, że jądro po prostu niszczy proces, nie próbowano dostarczać sygnału).

Aby prawidłowo daemonize jeden proces Go zaleca się stosowanie procesu otoki (np daemon) lub uruchomić go pod zaawansowany substytut init SuperServer takich jak systemd lub upstart lub samodzielnym nadzorca takich jak runit, monit i inni — w takim przypadku proces nie ma wymaganego braindeadu, aby być prawdziwym demonem Unix i może zachowywać się jak normalny proces: nie wykonuje podwójnego oszustwa, nie robi bałaganu z zarządzaniem plikami PID, jest w stanie napisać do swojego zwykłego Strumienie I/O itp.

Powiązane problemy