接続切断後もリモートサーバのバックグラウンドで実行する方法
ターミナルなどからリモートサーバに 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 ファイルに出力が保存されています.
この出力が更新されていれば,動いていることを確認できるわけです.
cat
や vim
コマンドで逐一確認することもできますが,tail
コマンドを使うとより簡単に確かめることができます.
terminal
$ tail ./nohub.out -n 5 -f
tail
コマンドは最終行から数行を出力する機能を持っていますが,オプション -f
をつけて実行することで常に待機させておくことができます.
ファイルサイズの変更がなければ表示が変わりませんが,対象のファイルがログを追加していくような形であれば使えるコマンドです.
オプション -n
は最終行から数えたときに出力する行数を指定します.デフォルトは 10 行です.
待機状態から出るには Ctrl + C を使います.
その他
自分しか使っていない,かつプログラムは一つしか動かしていないのであれば,nvidia-smi
でメモリの占有率を見るなどの方法も考えられます.