Warum können Unix-Programme keine Signale mit aussagekräftigen programmdefinierten Namen haben (anstelle von USR1 usw.)?

79

Viele Unix-Programme akzeptieren Signale wie USR1und USR2. Um beispielsweise die ausführbare Datei für Nginx im laufenden Betrieb zu aktualisieren, senden Sie kill -USR2.

Ich verstehe, dass dies USR1ein "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 -UPGRADEoder 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?

Nathan Long
quelle
1
Apropos von nichts - Es ist interessant, dass nginx QUIT für ein ordnungsgemäßes Herunterfahren verwendet. Es ähnelt traditionell TERM + Dump-a-Core. TERM kann ordnungsgemäß heruntergefahren werden. Es hängt alles davon ab, wie Sie mit Signalen umgehen, aber es ist seltsam, wenn Entwickler die ausgetretenen Pfade verlassen.
Synthesizerpatel
1
TIL: man signalBespricht Signale und listet 31 davon auf.
Nathan Long

Antworten:

80

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. USR1und USR2sind 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 signalum 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 .

Erik
quelle
22

HUPist 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 ein SIGHUPSignal gesendet wurde.

WINCHist 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 (wie xterm) ausgeführt wird.

caf
quelle
10

Versuchen Sie kill -l, die Antwort selbst zu finden:

1)  SIGHUP       2)  SIGINT       3)  SIGQUIT      4)  SIGILL       5)  SIGTRAP
6)  SIGABRT      7)  SIGBUS       8)  SIGFPE       9)  SIGKILL      10) SIGUSR1
11) SIGSEGV      12) SIGUSR2      13) SIGPIPE      14) SIGALRM      15) SIGTERM
16) SIGSTKFLT    17) SIGCHLD      18) SIGCONT      19) SIGSTOP      20) SIGTSTP
21) SIGTTIN      22) SIGTTOU      23) SIGURG       24) SIGXCPU      25) SIGXFSZ
26) SIGVTALRM    27) SIGPROF      28) SIGWINCH     29) SIGIO        30) SIGPWR
31) SIGSYS       34) SIGRTMIN     35) SIGRTMIN+1   36) SIGRTMIN+2   37) SIGRTMIN+3
38) SIGRTMIN+4   39) SIGRTMIN+5   40) SIGRTMIN+6   41) SIGRTMIN+7   42) SIGRTMIN+8
43) SIGRTMIN+9   44) SIGRTMIN+10  45) SIGRTMIN+11  46) SIGRTMIN+12  47) SIGRTMIN+13
48) SIGRTMIN+14  49) SIGRTMIN+15  50) SIGRTMAX-14  51) SIGRTMAX-13  52) SIGRTMAX-12
53) SIGRTMAX-11  54) SIGRTMAX-10  55) SIGRTMAX-9   56) SIGRTMAX-8   57) SIGRTMAX-7
58) SIGRTMAX-6   59) SIGRTMAX-5   60) SIGRTMAX-4   61) SIGRTMAX-3   62) SIGRTMAX-2
63) SIGRTMAX-1   64) SIGRTMAX
Diego Torres Milano
quelle
9

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, -UPGRADEwenn Sie möchten, und sie das USR1Signal liefern lassen , aber der killmit 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 bashAlias:

alias upgrade='kill -USR1'

Die signal.hHeader-Datei ordnet die Signalnamen ihren tatsächlichen Werten zu, die implementierungsabhängig sind.

In Bezug auf WINCHhalte 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 :-)

paxdiablo
quelle
1
Ah - natürlich ist es killselbst ein Programm, von dem man nichts wissen würde -UPGRADE. Daran habe ich nicht gedacht. :)
Nathan Long
5

Auf POSIX-kompatibele Plattformen SIGUSR1und SIGUSR2sind Signale an einen Prozeß gesendet benutzerdefinierte Bedingungen anzuzeigen. Die symbolischen Konstanten für sie sind in der Header-Datei definiert signal.h. Symbolische Signalnamen werden verwendet, da die Signalnummern plattformübergreifend variieren können.

SIGist ein gebräuchliches Präfix für Signalnamen. USRist eine Abkürzung für benutzerdefiniert.

Johnsyweb
quelle
3
Ein Beispiel hierfür sind die ext {2,3,4} -Varianten, mit fsckdenen 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 ".
Hlovdal
5

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.

Naum
quelle