Ein dämonisierter Go-Prozess kann nicht mit „syscall.Kill()“ ausgeführt werden
Frage
Ich habe in Go ein Programm erstellt, das einen Prozess abbricht syscall.Kill()
Aber wenn ich diesen Prozess vernichte fork()
+ setsid()
Dann syscall.Kill()
tötet diesen Prozess nicht ab.
Wenn ich Shell verwende kill
dann kann ich diesen Prozess in beiden Fällen abbrechen.
Ich habe verschiedene Signale ausprobiert: SIGINT
, SIGTERM
Und SIGKILL
Aber sie töten den Dämon nicht.
Lösung
Dämonisierung eines Go-Prozesses mithilfe von Systemaufrufen ist derzeit nicht zuverlässig möglich und deshalb war es unmöglich, Ihren dämonisierten Prozess zu beenden:es wurde verkeilt (obwohl ich zugeben sollte, dass es seltsam ist, warum es nicht als Reaktion auf das Senden abstürzte). SIGKILL
was dazu führt, dass der Kernel den Prozess einfach zerstört, es wird keine Signalübermittlung versucht).
Um einen Go-Prozess ordnungsgemäß zu dämonisieren, wird empfohlen, einen Wrapper-Prozess zu verwenden (z. B daemon
) oder führen Sie es unter einem erweiterten Ersatz für aus init
Superserver wie z systemd
oder upstart
oder ein eigenständiger Vorgesetzter wie z runit
, monit
und andere – in diesem Fall muss der Prozess nicht unbedingt ein echter Unix-Daemon sein und kann sich wie ein normaler Prozess verhalten:führt keine Doppelfunktion ausfork
+setsid
Tricks, stört die PID-Dateiverwaltung nicht, ist in der Lage, in seine regulären I/O-Streams zu schreiben usw.