web-dev-qa-db-ja.com

アプリケーションを適切に終了せずにターミナルウィンドウを閉じるのは危険ですか。

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

matlab -nodisplay -nodesktop -nosplash

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

exit

mATLABを終了してターミナルウィンドウを閉じるか、ターミナルウィンドウを閉じます。これら2つの方法の違いは何ですか? 2番目の方法は何とかして「害」を与えますか?最初の方法が優先されますか?どうして?

18
Fixed Point

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

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

親プロセスであることの責任の一部は、これと同じ親密な「シグナル」を子供たちに送信することです。

ここで、今説明したことを概念的に理解したら、実際の用語をもう少し置き換えてみましょう。

信号

最初に「シグナル」を使用すると、実際には さまざまなシグナルのファミリー全体 があり、これをUnixプロセスに送信できます。簡単にするために、よく目にするのはSIGHUPSIGTERMSIGINTSIGKILLの4つです。

  • SIGHUP

    SIGHUPシグナルは、制御端末が閉じているときにプロセスに送信されます。元々は、シリアル回線のドロップをプロセスに通知するように設計されていました。最近のシステムでは、この信号は通常、疑似または仮想端末の制御が閉じられたことを意味します。

  • SIGTERM

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

  • SIGINT

    SIGINT(「プログラム割り込み」)信号は、ユーザーがINTR文字(通常はC-c))を入力したときに送信されます。

  • シギル

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

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

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

ほとんどの場合、SIGTERMはウィンドウ環境から呼び出され、端末に渡されます。次に、端末はおそらくSIGHUPをMATLABに送信します。このシグナルは、すべてのプロセスにローカルでクリーンアップ(ファイルのクローズ、プロセスの終了など)を実行する機会を与えます。

killコマンド

自分で信号を送信するには、名前の付いていないコマンド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は、ほとんどすべてのプロセスを強制終了できます。

22
slm

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

2
Mark