リモート接続の切断でプロセスが終了する理由とその対策
リモート接続が切れるとプロセスが終了する理由
リモートサーバーにSSH接続して作業中、接続が切れた途端に実行中のプロセスが終了してしまう経験ありますよね。
これは、接続の切断時にプロセスへ送信される特定のシグナルが原因です。
killコマンドと主要なシグナル一覧
1. SIGHUP(ハングアップシグナル)の概要
- SIGHUP(Signal Hang UP)は、元々は物理的な端末の切断を検知するために設計されたシグナルです。
- リモート接続(SSH)の切断時にも、この SIGHUPシグナルが実行中のシェルやプロセスに送信されます。
SIGHUPが送信される流れ
- SSH接続の切断(ネットワークの問題、ユーザーのログアウト、タイムアウトなど)。
- シェル(bash など)に SIGHUP が送信される。
- シェル内の全プロセスに対して SIGHUP が伝播。
- SIGHUP を受け取ったプロセスは デフォルトの動作として終了する。
2. 例: SSH接続切断によるプロセス終了
通常のコマンド実行
sleep 600
これを実行中に SSH接続が切れると、sleep プロセスは SIGHUPシグナルを受け取り終了します。
SIGHUPによるプロセス終了を防ぐ方法
1. nohup コマンドの使用
nohup を使うことで、SIGHUPシグナルが無視され、プロセスがログアウト後も継続します。
nohup sleep 600 &
nohup によって SIGHUPが無視され、プロセスはバックグラウンドで実行され続けます。
2. disown コマンドの使用
既にバックグラウンドで実行しているプロセスを SIGHUPの影響から切り離すには、disown コマンドを使います。
例:
プロセスをバックグラウンドで実行。
sleep 600 &
disown でジョブを切り離し、SIGHUPを無視。
disown
これにより、SSHセッションが切断されても sleep プロセスは終了しません。
3. screen や tmux の使用
仮想ターミナルマネージャを使用することで、セッションを完全に独立させることができます。
screen や tmux を使えば、ログアウト後もセッションを再接続し、プロセスの管理が可能です。
例: tmux の使用
tmux
セッション内でコマンドを実行し、Ctrl + B → D でデタッチ。
再ログイン後、tmux attach でセッションに戻れます。
まとめ
リモート接続が切れると SIGHUP(ハングアップシグナル) が送信され、実行中のプロセスは終了します。
この挙動は、nohup や disown、もしくは screen や tmux を使うことで防ぐことができます。
長時間実行する重要な処理を行う場合は、これらのツールを活用して、セッション切断によるプロセス中断を防止しましょう。
Discussion