&
バックグラウンドでプロセスを実行するコマンドをリンクできることがわかります。
SSHを介してUbuntu 12.04システムに接続し、$python program.py &
-を使用してPythonプログラムを実行していますが、ターミナルウィンドウを閉じるとターミナルを閉じると、実行中のプロセスが終了するというメッセージが表示されます。
なぜこれですか? &記号を使用してバックグラウンドでプロセスを実行しています。 SSHを介して接続されているかどうかに関係なく、どのように機能させますか?
ベストアンサー1
ターミナルウィンドウを閉じると、ターミナルエミュレータは実行中のプロセス(シェルなど)にSIGHUPを送信します。その後、シェルはそのSIGHUPを実行中のすべての項目に渡します。ローカルシステムではsshです。その後、sshはSIGHUPを実行中のリモートシェルに渡します。したがって、リモートシェルはすべてのプロセス(デーモン)にSIGHUPを送信します。
この問題を解決する方法は2つあります。
- シェルからバックグラウンドプログラムの接続を解除します。
disown
プロセスをバックグラウンドに配置したら、このコマンドを使用します。これにより、シェルがこれを忘れてしまいます。- コマンドの前に
nohup
()を追加しますnohup $python program.py &
。これは同じことを行いますが、中間プロセスを使用します。デフォルトでは、SIGHUP信号を無視してから設定を継承するプログラムを分岐して実行し、終了します。フォークされるため、起動されるプログラムはシェルのサブルーチンではなく、シェルはそれを認識しません。 SIGHUP用のシグナルハンドラを取り付けない限り、無視されたままになります。
- ターミナルウィンドウを閉じる代わりに
logout
(またはCtrl+)を使用してください。dを使用すると、logout
これはSIGHUPではないため、シェルは子にSIGHUPを送信しません。
また、プログラムがSTDOUTまたはSTDERRを介して端末に書き込まないようにする必要があります。端末が終了すると、両方とももはや存在しないからです。そのようにリダイレクトしないと、/dev/null
プログラムは実行を続けますが、書き込みを試みるとSIGPIPEを受け取り、SIGPIPEのデフォルトの動作はプロセスを終了することです。