Viele Unix-Programme akzeptieren Signale wie USR1
und USR2
. Um beispielsweise die ausführbare Datei für Nginx im laufenden Betrieb zu aktualisieren, senden Sie kill -USR2
.
Ich verstehe, dass dies USR1
ein "benutzerdefiniertes" Signal ist, was bedeutet, dass jeder, der das Programm erstellt hat, es verwenden kann, um "herunterfahren" oder "Ihre Protokolle sichern" oder "tausendmal drucken" oder was auch immer zu bedeuten. Aber ich verstehe nicht, warum sie diesen beliebigen Namen verwenden müssen. Warum nicht kill -UPGRADE
oder kill -GRACEFUL_SHUTDOWN
? Erlaubt Unix nur bestimmte Signale?
Währenddessen verwendet Nginx auch die folgenden Signale (siehe Dokumentation ):
- TERM, INT : Schnellabschaltung
- BEENDEN : Anmutiges Herunterfahren
- HUP :
- Konfiguration neu laden
- Starten Sie die neuen Worker-Prozesse mit einer neuen Konfiguration
- Fahren Sie die alten Arbeitsprozesse ordnungsgemäß herunter
- USR1 : Öffnen Sie die Protokolldateien erneut
- USR2 : Upgrade ausführbar im laufenden Betrieb
- WINCH : Fahren Sie die Worker-Prozesse ordnungsgemäß herunter
HUP? WINDE? Was ist der Grund für diese Namen? Wo kann ich mehr darüber erfahren?
man signal
Bespricht Signale und listet 31 davon auf.Antworten:
Die auf einem Betriebssystem verfügbaren Signale werden vom Betriebssystem definiert (normalerweise nach POSIX) - es handelt sich nicht um "Zeichenfolgen", sondern um ganzzahlige Konstanten mit Standardnamen.
USR1
undUSR2
sind die beiden Signale, die keine spezifische Bedeutung haben - für jede willkürliche Verwendung, die der Entwickler wünscht.Lesen Sie auf Ihrem Linux-Computer,
man 7 signal
um eine Übersicht über die Signalverarbeitung und die Signale zu erhalten.Sie können die Bedeutung anderer Signale neu definieren, wenn Sie bereit sind, mit dem Betriebssystem umzugehen, das diese Signale als Reaktion auf Ereignisse ausgibt. Sie können z. B.
HUP
"Konfiguration neu laden" bedeuten - solange Sie entweder sicher sind, dass der Prozess niemals hängen bleibt (Terminalverlust), oder bereit sind, Fälle zu behandeln, in denen das Betriebssystem und nicht ein Benutzer das HUP-Signal sendet .quelle
HUP
ist die Abkürzung für "Auflegen". Dieses Signal wird an einen Prozess gesendet, wenn sein steuerndes Terminal das Dateiende erreicht. Früher wurden Steuerterminals normalerweise an serielle Schnittstellen angeschlossen, möglicherweise über eine Modemverbindung über eine Telefonleitung. Wenn die Telefonverbindung unterbrochen wurde, senkte das lokale Modem die Carrier Detect-Leitung, was dazu führte, dass der Kernel das Dateiende meldete und einSIGHUP
Signal gesendet wurde.WINCH
ist die Abkürzung für "Fensterwechsel". Es wird an einen Prozess gesendet, wenn sich die Größe seines steuernden Terminals ändert. Aus offensichtlichen Gründen sind Terminals, deren Größe sich ändern kann, normalerweise Pseudo-Terminals, die letztendlich durch einen Terminalemulator dargestellt werden, der in einer Fensterumgebung (wiexterm
) ausgeführt wird.quelle
Versuchen Sie
kill -l
, die Antwort selbst zu finden:quelle
Weil die Namen der Signale standardisiert sind (von POSIX). Sie können Ihre eigene ausführbare Datei vom Typ kill schreiben, um sie zu übernehmen,
-UPGRADE
wenn Sie möchten, und sie dasUSR1
Signal liefern lassen , aber derkill
mit UNIX gelieferte Standard erkennt es nicht.Alternativ können Sie einen Alias, eine Funktion oder ein Shell-Skript erstellen, um die Übersetzung für Sie durchzuführen, z. B. mit dem
bash
Alias:Die
signal.h
Header-Datei ordnet die Signalnamen ihren tatsächlichen Werten zu, die implementierungsabhängig sind.In Bezug auf
WINCH
halte ich dies für einen Gräuel. Dies ist das Signal, das an Anwendungen gesendet wird, wenn sich deren Fenstergröße ändert (insbesondere wenn sich das Fenster ihres steuernden Terminals ändert).Es ist keine gute Idee, Worker-Threads ordnungsgemäß herunterzufahren, es sei denn, Sie können garantieren, dass der Prozess niemals in einem Terminal ausgeführt wird. Ich weiß, ich wäre ziemlich verärgert, wenn ich eine Anwendung ausführen würde, und sie hat beschlossen, alle Arbeiten im Flug abzubrechen, nur weil ich das Fenster maximiert habe :-)
quelle
kill
selbst ein Programm, von dem man nichts wissen würde-UPGRADE
. Daran habe ich nicht gedacht. :)Auf POSIX-kompatibele Plattformen
SIGUSR1
undSIGUSR2
sind Signale an einen Prozeß gesendet benutzerdefinierte Bedingungen anzuzeigen. Die symbolischen Konstanten für sie sind in der Header-Datei definiertsignal.h
. Symbolische Signalnamen werden verwendet, da die Signalnummern plattformübergreifend variieren können.SIG
ist ein gebräuchliches Präfix für Signalnamen.USR
ist eine Abkürzung für benutzerdefiniert.quelle
fsck
denen in USR1 Fortschrittsinformationen gedruckt und in USR2 gestoppt werden. Sehr praktisch, wenn Sie Probleme mit dem Dateisystem haben, von einer Rettungs-CD booten, fsck starten, um das Problem zu beheben, und nach einer Weile, wenn Sie sich vom Warten langweilen, erkennen, dass "verdammt, ich hätte eine Option angeben sollen, um Fortschrittsinformationen zu aktivieren ".Signalnamen stammen aus früheren Zeiten als Posix.
Ich möchte über SIG ** IOT ** sprechen. In den Zeiten, in denen DEC PDP-Mainframes verwendet wurden, verfügten die verwendeten Prozessoren über eine spezielle IOT-Anweisung (I / O Trap), die häufig zum sanften Absturz des Systems verwendet wurde und normalerweise zum Neustart zwang (auf Echtzeitservern). Der gesamte Kernel sowie die Gerätetreiber und privilegierten Prozesse (in Assembler geschrieben) verwendeten diese Methode. Noch heute gibt es Prozessoren, die diese IOT-Anweisung haben.
Wenn im Kernel eine IOT-Anweisung in einer nicht privilegierten Domäne ausgeführt wird, wird ein SIGIOT für den betroffenen Prozess ausgelöst.
quelle