Auf POSIX-Systemen haben Terminierungssignale normalerweise die folgende Reihenfolge (gemäß vielen MAN-Seiten und der POSIX-Spezifikation):
SIGTERM - Bitten Sie höflich um die Beendigung eines Prozesses. Es wird ordnungsgemäß beendet, alle Ressourcen (Dateien, Sockets, untergeordnete Prozesse usw.) bereinigt, temporäre Dateien gelöscht usw.
SIGQUIT - energischere Anfrage. Es wird unansehnlich beendet und bereinigt weiterhin Ressourcen, die unbedingt bereinigt werden müssen, löscht jedoch möglicherweise keine temporären Dateien, schreibt möglicherweise irgendwo Debug-Informationen. Auf einigen Systemen wird auch ein Core-Dump geschrieben (unabhängig davon, ob das Signal von der App abgefangen wird oder nicht).
SIGKILL - energischste Anfrage. Der Prozess wird nicht einmal aufgefordert, etwas zu tun, aber das System bereinigt den Prozess, ob es ihm gefällt oder nicht. Höchstwahrscheinlich wird ein Core Dump geschrieben.
Wie passt SIGINT in dieses Bild? Ein CLI-Prozess wird normalerweise von SIGINT beendet, wenn der Benutzer CRTL + C drückt. Ein Hintergrundprozess kann jedoch auch von SIGINT mit dem Dienstprogramm KILL beendet werden. Was ich in den Spezifikationen oder den Header-Dateien nicht sehen kann, ist, ob SIGINT mehr oder weniger stark als SIGTERM ist oder ob es überhaupt einen Unterschied zwischen SIGINT und SIGTERM gibt.
AKTUALISIEREN:
Die beste Beschreibung der Terminierungssignale, die ich bisher gefunden habe, finden Sie in der GNU LibC-Dokumentation . Es erklärt sehr gut, dass es einen beabsichtigten Unterschied zwischen SIGTERM und SIGQUIT gibt.
Es heißt über SIGTERM:
Es ist der normale Weg, ein Programm höflich um Beendigung zu bitten.
Und es heißt über SIGQUIT:
[...] und erzeugt einen Core-Dump, wenn er den Prozess beendet, genau wie ein Programmfehlersignal. Sie können sich dies als eine Programmfehlerbedingung vorstellen, die vom Benutzer „erkannt“ wurde. [...] Bestimmte Arten von Bereinigungen werden bei der Handhabung von SIGQUIT am besten weggelassen. Wenn das Programm beispielsweise temporäre Dateien erstellt, sollte es die anderen Beendigungsanforderungen durch Löschen der temporären Dateien verarbeiten. Für SIGQUIT ist es jedoch besser, sie nicht zu löschen, damit der Benutzer sie in Verbindung mit dem Core-Dump untersuchen kann.
Und SIGHUP wird auch gut genug erklärt. SIGHUP ist nicht wirklich ein Beendigungssignal, es bedeutet nur, dass die "Verbindung" zum Benutzer unterbrochen wurde, sodass die App nicht erwarten kann, dass der Benutzer weitere Ausgaben liest (z. B. stdout / stderr-Ausgabe), und dass keine Eingabe von der zu erwarten ist Benutzer nicht mehr. Für die meisten Apps bedeutet dies, dass sie besser beendet werden. Theoretisch könnte eine App auch entscheiden, dass sie beim Empfang eines SIGHUP in den Dämonmodus wechselt und nun als Hintergrundprozess ausgeführt wird und die Ausgabe in eine konfigurierte Protokolldatei schreibt. Für die meisten Daemons, die bereits im Hintergrund ausgeführt werden, bedeutet SIGHUP normalerweise, dass sie ihre Konfigurationsdateien erneut überprüfen müssen, sodass Sie sie nach dem Bearbeiten der Konfigurationsdateien an Hintergrundprozesse senden.
Es gibt jedoch keine nützliche Erklärung für SIGINT auf dieser Seite, außer dass es von CRTL + C gesendet wird. Gibt es einen Grund, warum man SIGINT anders als SIGTERM behandeln würde? Wenn ja, aus welchem Grund und wie wäre die Handhabung anders?
sudo fuser -l
an Ihrer Eingabeaufforderung finden. Für mich bringt dies:HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS UNUSED
kill -l
eine Liste der Signale.