接続切断後もリモートサーバのバックグラウンドで実行する方法

ターミナルなどからリモートサーバに SSH 接続して Python などを実行している場合,SSH 接続が切れると同時にプログラムも止まってしまいます.

長時間プログラムを動作させたいのであれば,接続が切断してもバックグラウンドで動き続けるように指示を出すのがよいです.

接続していないと動かないのでは,なんらかの理由で回線切断にあったときにそれまでの計算結果が消えてしまい,途方に暮れることになりかねません.(途中でエクスポートでもしていなければ)

実行方法

バックグラウンドで実行

terminal

$ python sample.py &

コマンドに&をつけることでバックグラウンドで実行させることができます.

このバックグラウンドというのは SSH 接続されているときにフォアグラウンドで別の処理を可能にするためのもので,切断しても OK ではありません.

シェルから切り離して実行

terminal

$ nohup python sample.py

nohup コマンドで実行すると HUP シグナル (SIGHUP) を無視するので,SSH 接続中のターミナルを終了してもプログラムは終了せずに動き続けます.

そのため,nohup かつバックグラウンドで実行することで,リモートサーバからログアウトしてもプログラムを動かし続けることができます.

terminal

$ nohup python sample.py &

また,nohup で実行しているときの出力は nohup.out ファイルに出力されています.

ちなみに,HUP というのは hangup から来ているのだとか...

(エイリアスを使って実行したプログラムには使えないようです.コマンドは正式なものを使用してください.)

既に動いているプログラムに適用する?

(追記)シェルによって少し操作が異なるようです.

上記のコマンドは実行時に利用することができますが,既に動かしているプログラムについてもシェルから切り離してバックグラウンドに移行する方法があります.

予め,以下のようにしてプログラムを実行しているものとします.

terminal

$ python sample.py

実行したままではコマンドを入力できないので Ctrl + Z でジョブを中断し,バックグラウンドに移行させます.

terminal

$ bg

bg コマンドは中断させているジョブをバックグラウンドで再開させるコマンドです.

その後,現在のシェルからこのプロセスを切り離します.そのときに -h オプションを付けることで HUP シグナルを無視させることができます.(bash)

terminal

$ disown -h

zsh では以下のエラー文が表示されるため上記の方法は利用できませんが,オプション無しで disown すれば同様の処理が可能なようです.

disown: job not found: -h

もし,zsh で nohup でないプロセスが動いている状態で exit を実行すると,以下の警告文が表示されます.

zsh: warning: 1 jobs SIGHUPed

プログラムが動いているか確認する

プロセスの確認

terminal

$ ps -aux | grep python
user      5643 99.6  0.2 55877080 568420 ?     Rl   10:08   0:41 python sample.py
user      5825  0.0  0.0  15204   976 pts/9    R+   10:08   0:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox python

ps コマンドは実行中のプロセスを表示することができるコマンドです.

最後の列がコマンドの内容になっており,ここに Python を実行したときのコマンドが残っていれば裏で動いています.

出力ファイルの確認

先ほど説明したように nohup コマンドで実行している場合は nohup.out ファイルに出力が保存されています.

この出力が更新されていれば,動いていることを確認できるわけです.

catvim コマンドで逐一確認することもできますが,tail コマンドを使うとより簡単に確かめることができます.

terminal

$ tail ./nohub.out -n 5 -f

tail コマンドは最終行から数行を出力する機能を持っていますが,オプション -f をつけて実行することで常に待機させておくことができます.

ファイルサイズの変更がなければ表示が変わりませんが,対象のファイルがログを追加していくような形であれば使えるコマンドです.

オプション -n は最終行から数えたときに出力する行数を指定します.デフォルトは 10 行です.

待機状態から出るには Ctrl + C を使います.

その他

自分しか使っていない,かつプログラムは一つしか動かしていないのであれば,nvidia-smi でメモリの占有率を見るなどの方法も考えられます.