Ist es möglich, ein Ctrl + C-Signal zu erfassen und eine Bereinigungsfunktion in einer "Defer" -Methode auszuführen?
Ich will die Strg+C (SIGINT
) gesendete signal von der Konsole aus, und drucken Sie einige Teil-Summen.
Ist das möglich in Golang?
Hinweis: zuerst, Als ich die Frage gepostet war ich verwirrt über die Strg+C wird SIGTERM
statt SIGINT
.
InformationsquelleAutor der Frage Sebastián Grignoli | 2012-06-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die os/signal - Paket für die Verarbeitung der eingehenden Signale. ^C ist SIGINTso können Sie diese auf trap
os.Interrupt
.Die Art und Weise, in dem Sie die Ursache Ihres Programms zu beenden und drucken von Informationen ist völlig bis zu Ihnen.
InformationsquelleAutor der Antwort Kevin Ballard
Dies funktioniert:
InformationsquelleAutor der Antwort Barry
Hinzufügen, leicht auf die anderen Antworten, wenn Sie wirklich wollen, zu fangen SIGTERM (default-signal, das durch den kill-Befehl), die Sie verwenden können
syscall.SIGTERM
im Ort os.Unterbrechen. Beachten Sie, dass die syscall-Schnittstelle ist system-spezifisch und funktioniert eventuell nicht überall (z.B. auf windows). Aber es funktioniert gut zu erwischen:InformationsquelleAutor der Antwort adamlamar
Gab es (zum Zeitpunkt der Buchung) ein oder zwei kleine Tippfehler in der akzeptierten Antwort oben, also hier ist die gereinigte version. In diesem Beispiel bin ich stoppen des CPU-profiler beim Empfang von Ctrl+C.
InformationsquelleAutor der Antwort gravitron
Alle der oben genannten scheinen zu arbeiten, wenn gespleißt, aber gobyexample Signale Seite hat eine wirklich saubere und vollständige Beispiel der signal-Erfassung. Wert hinzufügen zu dieser Liste.
InformationsquelleAutor der Antwort will-ob
Dies ist eine weitere version, die in den Fall, Sie haben einige Aufgaben zu bereinigen. Code hinterlässt clean-up-Prozess in Ihrer Methode.
in den Fall, Sie brauchen, um saubere main-Funktion, die Sie erfassen müssen-signal in den Haupt-thread mit go func() sowie.
InformationsquelleAutor der Antwort Hlex
Tod ist eine einfache Bibliothek, die Kanäle verwendet, und eine Gruppe warten Wartezeit für shutdown-Signalen. Sobald das signal empfangen wurde, wird dann rufen Sie die close-Methode auf alle Ihre Strukturen, die Sie möchten, zu bereinigen.
InformationsquelleAutor der Antwort Ben Aldrich
Können Sie eine andere goroutine, der erkennt, syscall.SIGINT und syscall.SIGTERM-Signale und leiten Sie dann an einen Kanal mit signal.Informieren. Sie können senden Sie einen Haken an, die goroutine mit einem Kanal und speichern Sie es in eine Funktion slice. Wenn das shutdown-signal erkannt wird, auf den Kanal, können Sie diese Funktionen ausführen, die in die Scheibe. Dies kann verwendet werden, zu bereinigen, die Ressourcen, warten Sie für die Ausführung von goroutines auf fertig stellen, speichern von Daten oder drucken von Teil-Summen.
Schrieb ich ein kleines und einfaches Dienstprogramm zum hinzufügen und führen Sie die Haken beim Herunterfahren. Hoffe, es kann helfen.
https://github.com/ankit-arora/go-utils/blob/master/go-shutdown-hook/shutdown-hook.go
Können Sie dies tun, in ein 'defer' Mode.
Beispiel für das Herunterfahren eines Servers anmutig :
InformationsquelleAutor der Antwort Ankit Arora
Gerade für die Aufzeichnung, wenn jemand braucht eine Möglichkeit zum verarbeiten von Signalen auf Windows. Ich hatte die Anforderung der Griff aus dem prog Eine Berufung prog-B bis os/exec aber prog B war nie in der Lage zu beenden, anmutig, weil das senden von Signalen durch ex. cmd.Prozess.Signal(syscall.SIGTERM) oder andere Signale werden unter Windows nicht unterstützt. Die Art, wie ich behandelt, ist das erstellen einer temp-Datei als signal ab. .signal.Begriff durch prog A und prog B zu überprüfen, ob eine Datei existiert, die auf Intervall-Basis, wenn die Datei existiert, wird das Programm beendet und Griff eine Bereinigung, wenn nötig, ich bin sicher, es gibt andere Möglichkeiten, aber dies hat den job.
InformationsquelleAutor der Antwort user212806