アプリケーションを適切に終了せずにターミナルウィンドウを閉じることは有害ですか?


18

Ubuntu 12.04 LTSを使用して、私の質問は、ターミナルウィンドウでアプリケーションを起動した場合、最初にアプリケーションを適切に終了せずにターミナルウィンドウを閉じるだけで何か悪いことがあるということです。たとえば、MATLABを使用します。ターミナルを開いて入力します

matlab -nodisplay -nodesktop -nosplash

その後、一連のスクリプトを実行します。その後、私はどちらか

exit

MATLABを終了してからターミナルウィンドウを閉じるか、単にターミナルウィンドウを閉じます。これら2つの方法の違いは何ですか?2番目の方法は何らかの形で何かを「害」しますか?最初の方法が好ましいですか?どうして?

回答:


22

一般に、この方法でこれを行うには問題ありません。

「X」をクリックしてターミナルウィンドウを閉じると、デスクトップ(GNOME、KDEなど)からターミナルアプリケーションに「シグナル」が送信され、シャットダウンするよう指示されます。このシェルでMATLABを実行しているため、ターミナルアプリケーションの子プロセスと見なされます。

そのため、親プロセスになる責任の一部は、この同じ「信号」を子供に順番に送信することです。

さて、私が今説明したことを概念的に理解したら、実際の用語をもう少し使いましょう。

信号

最初に「シグナル」を使用すると、実際にはUnixプロセスに送信できるさまざまなシグナルのファミリーがあります。それをシンプルに保つために4あなたが頻繁に表示されますことを、そこにあるSIGHUPSIGTERMSIGINT、とSIGKILL

  • シグアップ

    SIGHUPシグナルは、制御端末が閉じられたときにプロセスに送信されます。もともとは、シリアル回線のドロップをプロセスに通知するために設計されました。現代のシステムでは、この信号は通常、擬似または仮想端末の制御が閉じられたことを意味します。

  • SIGTERM

    SIGTERMシグナルは、プログラムを終了させるために使用される一般的なシグナルです。SIGKILLとは異なり、この信号はブロック、処理、および無視できます。これは、プログラムに終了を丁寧に依頼する通常の方法です。

  • SIGINT

    ユーザーがINTR文字(通常はCc)を入力すると、SIGINT(「プログラム割り込み」)シグナルが送信されます。

  • SIGKILL

    SIGKILLシグナルは、プログラムを即座に終了させるために使用されます。これは処理または無視できないため、常に致命的です。この信号をブロックすることもできません。

注: SIGINT実行中にCtrl+ Cを使用してコマンドラインからプログラムを「中断」すると送信されます。

どれが使われていますか?

最も可能性が高いのSIGTERMは、ウィンドウ環境によって呼び出され、端末に渡されることです。その場合、端末はおそらくSIGHUPMATLABに送信されます。このシグナルは、すべてのプロセスにローカルクリーンアップ(ファイルのクローズ、プロセスの終了など)を実行する機会を与えます。

キルコマンド

よくない名前のコマンドを使用して、自分で信号を送信できますkill。したがってSIGTERM、端末またはSIGHUP to MATLAB, you could determine their PID usingps`に信号を送信してから、次のコマンドを実行して信号を送信します。

$ kill -SIGTERM <PID>

またはこれ:

$ kill -SIGHUP <PID>

次のコマンドを使用して、信号の完全なリストを取得できます。

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

信号に数字があることに注意してください?多くの場合、名前の代わりにそのように使用されるのを見るでしょう:

$ kill -15 <PID>

または悪名高い-9、ほとんどすべてのプロセスを殺すことができます。


私はいつもこれらの数字は負だと思っていましたが、実際にはコマンドライン引数です。私は何か新しいことを学んだ:D
トーマス

1
HUP-HangUP-端末用の「回線を失う」場合に送信される信号です。たとえば、モデムでUnixサーバーに接続した場合。これはおそらく、プロセスを終了させる最も「穏やかな」シグナルです。ほとんどのデーモンは終了しませんが、HUPで設定ファイルを再読み込みします。コマンドnohupを使用すると、シェルが閉じた後もバックグラウンドプロセスを続行できます。screenのようなコマンドはハングアップを切り抜け、その中のコマンドをHUPから隔離します。
バードコッペルード

@BaardKopperud-ありがとう、私は意図的にHUPを除外し、議論を混乱させたくありませんでした。
slm

@BaardKopperud-あなたが指摘しているのはこれだと思います:「SIGHUPシグナルは、その制御端末が閉じられたときにプロセスに送信されます。もともとは、シリアル回線のドロップをプロセスに通知するために設計されました。通常、擬似端末または仮想端末の制御が閉じられていることを意味します」
slm

@BaardKopperud-罪悪感を覚えたので、何が起きているかをより正確に反映するように答えを修正しました。ありがとう!
slm

2

ほとんどの場合は問題ありませんが、開いているアプリケーションによってはデータが失われます。たとえば、ファイルエディタを開いている場合、適切に保存して終了しないと、変更の一部が失われる可能性があります。心配な場合は、ターミナルを適切にログアウト/終了してください。入力が好きではない場合exitや、logout単に試してくださいCtrl-D


なぜそれが良いのでしょうか?アプリケーションは、SIGHUPの代わりに、SIGTERMを取得する予定ですが、私はまさに「適切に保存して終了」それを呼び出すことはありませんので、それはまだ、信号によって殺さなってきた
マイケルMrozek

限りCtrl-D、それは実際にコマンドプロンプトでのみ適用されます。
マーク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.