Ist es schädlich, ein Terminalfenster zu schließen, ohne eine Anwendung ordnungsgemäß zu beenden?

18

Unter Ubuntu 12.04 LTS lautet meine Frage: Wenn ich eine Anwendung in einem Terminalfenster gestartet habe, kann es nichts Schlimmes sein, das Terminalfenster zu schließen, ohne die Anwendung zuerst ordnungsgemäß zu beenden. Zum Beispiel verwende ich MATLAB. Ich öffne ein Terminal und tippe

matlab -nodisplay -nodesktop -nosplash

und dann eine Reihe von Skripten ausführen. Dann kann ich auch

exit

um MATLAB zu beenden und dann das Terminalfenster zu schließen oder einfach das Terminalfenster zu schließen. Was ist wirklich der Unterschied zwischen diesen beiden Methoden? "Schaden" die zweite Methode irgendwie irgendetwas? Ist die erste Methode bevorzugt? Warum?

Fixpunkt
quelle

Antworten:

22

Im Allgemeinen sollte dies in Ordnung sein, um es auf diese Weise zu tun.

Wenn Sie auf das "X" klicken, um das Terminalfenster zu schließen, sendet dieses ein "Signal" von Ihrem Desktop (GNOME, KDE usw.) an die Terminalanwendung und weist diese an, sich selbst herunterzufahren. Da Sie MATLAB in dieser Shell ausführen, wird es als untergeordneter Prozess für die Terminalanwendung betrachtet.

Ein Teil der Verantwortung eines Elternprozesses besteht darin, dass Sie Ihren Kindern dasselbe Signal senden.

Wenn Sie nun begrifflich verstehen, was ich gerade erklärt habe, lassen Sie uns ein bisschen mehr von der eigentlichen Terminologie ersetzen.

Signale

Erstens gibt es mit dem "Signal" tatsächlich eine ganze Familie verschiedener Signale , die Sie an Unix-Prozesse senden können. Um es einfach zu halten gibt es 4 , dass Sie oft sehen, SIGHUP, SIGTERM, SIGINT, und SIGKILL.

  • SEUFZEND

    Das SIGHUP-Signal wird an einen Prozess gesendet, wenn sein steuerndes Terminal geschlossen ist. Es wurde ursprünglich entwickelt, um den Prozess einer Unterbrechung der seriellen Leitung zu melden. In modernen Systemen bedeutet dieses Signal normalerweise, dass die Steuerung des Pseudo- oder virtuellen Terminals geschlossen wurde.

  • SIGTERM

    Das SIGTERM-Signal ist ein generisches Signal, das zum Beenden des Programms verwendet wird. Im Gegensatz zu SIGKILL kann dieses Signal blockiert, verarbeitet und ignoriert werden. Es ist die übliche Art, ein Programm höflich zum Abbruch aufzufordern.

  • ZEICHEN

    Das SIGINT-Signal ("Programm-Interrupt") wird gesendet, wenn der Benutzer das INTR-Zeichen (normalerweise Cc) eingibt.

  • SIGKILL

    Das Signal SIGKILL wird verwendet, um das Programm sofort zu beenden. Es kann nicht behandelt oder ignoriert werden und ist daher immer tödlich. Es ist auch nicht möglich, dieses Signal zu blockieren.

HINWEIS: SIGINT Wird gesendet, wenn Sie Ctrl+ verwenden C, um ein Programm von der Befehlszeile aus zu "unterbrechen", während es gerade ausgeführt wird.

welches wird benutzt?

Höchstwahrscheinlich SIGTERMwird das von Ihrer Windows-Umgebung angerufen und an Ihr Terminal weitergeleitet. Ihr Terminal sendet dann höchstwahrscheinlich SIGHUPan MATLAB. Dieses Signal gibt allen Prozessen die Möglichkeit, lokale Bereinigungen (Schließen von Dateien, Beenden von Prozessen usw.) selbst durchzuführen.

Befehl töten

Sie können selbst Signale mit dem schlecht benannten Befehl senden kill. So senden Sie das SIGTERMSignal an Ihr Terminal oder an das SIGHUP to MATLAB, you could determine their PID usingps` und führen dann den folgenden Befehl aus, um ihnen das Signal zu senden:

$ kill -SIGTERM <PID>

oder dieses:

$ kill -SIGHUP <PID>

Mit diesem Befehl können Sie eine vollständige Liste der Signale abrufen:

$ kill -l
 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
...
...

Beachten Sie, dass die Signale Zahlen haben? Sie werden oft sehen, wie sie so verwendet werden, anstatt nach ihren Namen:

$ kill -15 <PID>

Oder die berüchtigten -9, die so ziemlich jeden Prozess töten können.

slm
quelle
Ich dachte immer, diese Zahlen wären negativ, aber es handelt sich tatsächlich um Befehlszeilenargumente. Ich habe etwas Neues gelernt: D
Thomas
1
HUP - HangUP - ist das Signal, das gesendet wird, wenn Sie für ein Terminal "die Leitung verlieren", z. B. wenn Sie über ein Modem mit einem Unix-Server verbunden waren. Es ist wahrscheinlich das "sanfteste" Signal, das einen Prozess beendet. Die meisten Daemons werden nicht beendet, sondern lesen ihre Konfigurationsdateien auf HUP erneut. Mit dem Befehl nohup können Sie einen Hintergrundprozess fortsetzen lassen, nachdem die Shell geschlossen wurde. Befehle wie screen überstehen das Auflegen und isolieren die darin enthaltenen Befehle von HUP.
Baard Kopperud
@BaardKopperud - danke, ich habe HUP absichtlich ausgelassen, wollte die Diskussion nicht verwirren.
slm
@BaardKopperud - Ich denke, Sie weisen auf Folgendes hin: "Das SIGHUP-Signal wird an einen Prozess gesendet, wenn sein steuerndes Terminal geschlossen ist. Es wurde ursprünglich entwickelt, um den Prozess eines Ausfalls der seriellen Leitung zu benachrichtigen. In modernen Systemen ist dieses Signal "Ich gebe zu, ich habe ein bisschen in meiner Beschreibung gelogen, habe aber versucht, es einfach zu halten.
SLM
@BaardKopperud - Ich habe mich schuldig gefühlt, also habe ich meine Antwort geändert, um genauer zu reflektieren, was los ist. Vielen Dank!
SLM
2

Es ist höchstwahrscheinlich in Ordnung, aber Sie werden Daten verlieren, je nachdem, welche Anwendungen Sie geöffnet haben. Wenn Sie beispielsweise einen Datei-Editor geöffnet haben, können Sie einige Ihrer Änderungen verlieren, wenn Sie nicht ordnungsgemäß speichern und beenden. Wenn Sie sich Sorgen machen, melden Sie sich einfach ab und beenden Sie das Terminal ordnungsgemäß. Wenn Sie nicht gerne tippen exitoder es logouteinfach versuchen Ctrl-D.

Kennzeichen
quelle
Warum wäre das besser? Die Anwendung wird SIGHUP anstelle von SIGTERM erhalten, aber sie wird immer noch durch ein Signal beendet, sodass ich es nicht genau als "Speichern und ordnungsgemäß beenden" bezeichnen würde
Michael Mrozek
Soweit Ctrl-Dgilt das eigentlich nur an der Eingabeaufforderung.
Mark