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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top