Unterschied zwischen dem weniger gewaltsamen Abtötungssignal -HUP (1) -INT (2) und -TERM (15)

32

Abgesehen von den heftigsten kill -9(SIGKILL) verstehe ich den Unterschied zwischen den drei anderen gemeinsamen Signalen ( hier ) -HUP(1), -INT(2) und -TERM(15) nicht ganz.

In welchen Szenarien würde das eine funktionieren und das andere nicht?

Im Allgemeinen, wann schlägt -9( -KILL) fehl?

Mir scheint, dass sie den Prozess auffordern , ordnungsgemäß zu beenden , ohne zu speichern . Die Härte einzuschätzen, würde ich sagen -HUP < -TERM < -INT < -KILL.

Kenny
quelle
HUPbedeutet nicht unbedingt, dass das Programm beendet wird. Einige Programme SIGHUPladen Konfigurationsdateien neu. SIGKILLscheitert oder wird vielmehr verschoben, wenn sich der Prozess im unterbrechungsfreien Schlaf befindet .
muru

Antworten:

52

SIGKILL kann einen laufenden Prozess immer beenden, darum geht es. Es gibt andere Signale, die der Anwendung die Möglichkeit geben, zu reagieren.

Das Standardverhalten von SIGINT, SIGTERM, SIGQUIT und SIGHUP ist das Beenden des Programms. Anwendungen dürfen jedoch einen Handler für diese Signale installieren. Das tatsächliche Verhalten von Anwendungen beim Empfang dieser Signale ist daher eine Frage der Konvention (der jede Anwendung folgen kann oder nicht), nicht des Systemdesigns.

SIGINT ist der "schwächste" der Partie. Die übliche Bedeutung lautet: „Hör auf, was du gerade tust, und warte auf weitere Benutzereingaben“. Es ist das von Ctrl+ Cin einem Terminal erzeugte Signal . Nicht interaktive Programme behandeln sie im Allgemeinen wie SIGTERM.

SIGTERM ist das "normale" Kill-Signal. Es weist die Anwendung an, sauber zu beenden. Es kann einige Zeit dauern, bis die Anwendung ihren Status gespeichert hat, um Ressourcen freizugeben, z. B. temporäre Dateien, die sonst zurückbleiben würden usw. Eine Anwendung, die während einer kritischen Anwendung nicht unterbrochen werden möchte, ignoriert möglicherweise SIGTERM für eine Weile.

SIGHUP ist in Bezug auf die Härte mit SIGTERM identisch, spielt jedoch eine besondere Rolle, da es automatisch an Anwendungen gesendet wird, die in einem Terminal ausgeführt werden, wenn der Benutzer die Verbindung zu diesem Terminal trennt (etymologisch, weil der Benutzer eine Verbindung über eine Telefonleitung und das Modem hergestellt hat) aufgehangen). SIGHUP ist im Gegensatz zu SIGTERM, das explizit gesendet werden muss, häufig unfreiwillig. Daher sollten Anwendungen versuchen, ihren Status auf einem SIGHUP zu speichern. SIGHUP hat auch eine ganz andere konventionelle Bedeutung für nicht benutzerbezogene Anwendungen ( Daemons ), nämlich das Neuladen ihrer Konfigurationsdatei.

SIGQUIT ist das härteste der ignorierbaren Signale. Es soll verwendet werden, wenn sich eine Anwendung schlecht verhält und jetzt beendet werden muss. Standardmäßig hat es eine Core-Dump- Datei hinterlassen (moderne Systeme, bei denen die meisten Benutzer nicht wissen, welche Core-Datei sie normalerweise nicht erzeugt). . Anwendungen können einen Handler festlegen, sollten jedoch nur sehr wenig tun (insbesondere keinen Status speichern), da die Absicht von SIGQUIT darin besteht, verwendet zu werden, wenn ein schwerwiegender Fehler vorliegt.

Gilles 'SO - hör auf böse zu sein'
quelle
Können Sie mehr über "ihren Zustand retten" erläutern? Wenn ich mich in einem Texteditor befinde und ihn töte, wird der Inhalt vermutlich nicht gespeichert.
Kenny
2
@Kenny Die meisten Editoren speichern die Datei nicht, da Sie möglicherweise vorübergehend Änderungen vorgenommen haben, die Sie nicht speichern wollten. Fortgeschrittene Editoren (z. B. vi, emacs) haben eine automatische Speicherdatei, in der sie von Zeit zu Zeit Daten speichern. Bei SIGHUP stellen sie normalerweise sicher, dass die automatisch gespeicherte Datei auf dem neuesten Stand ist.
Gilles 'SO - hör auf böse zu sein'