hooked on mechatronics

いつまで経っても初心者

ssh接続した後,バックグラウンドでMATLABスクリプトを実行

早く知りたい方用

sshログイン後,バックグラウンド実行

  • script.mを実行し,その標準出力をoutfile.txtに記述
nohup matlab -nosplash -nodesktop -nodisplay -r 'script' > outfile.txt < /dev/null &
nohup matlab -nosplash -nodesktop -nodisplay -r 'script' > /dev/null 2>&1 < /dev/null &

ブログ全体を読めばこのコマンドの意味が理解でき,自分でカスタマイズできるようになるはずです.

sshログインからmatlab実行

ssh xxx matlab -nodisplay < hogehoge.m

これについてはあまり触れません. MATLABの公式HPのこちらを参照.

概要

上のコマンドは,

 \displaystyle
\underbrace{\textsf{nohup}}_{\textsf{バックグラウンド実行}} \, \underbrace{\textsf{matlab -nodesktop -nodisplay -r 'script'}}_{\textsf{MATLABコマンド}} \, \underbrace{\textsf{> outfile.txt < /dev/null}}_{\textsf{リダイレクト}} \, \underbrace{\textsf{&}}_{\textsf{バックグラウンド実行}}

のように分けられるので,

  • バックグラウンド実行
  • MATLABコマンド,オプション
  • リダイレクト

に分けてまとめて行こうと思います.

目次

対象読者

  • 既にssh接続したLinuxサーバ上でMATLABを動かしたことがある人
  • 基本的にはLinuxサーバを想定

やりたいこと

ssh接続を切ってもMATLABスクリプトを実行し続けるようにしたい
オプションを理解して,状況に応じて使い分けたい

バックグラウンド実行

nohupと&

以下のようにコマンドの最後に&を付けると,プログラムをバックグラウンドで実行するようになります.

command &

ただ,ssh接続を切ると,プログラムの実行が終了してしまうので, nohupを付けて終了しないようにします.
ちなみに,nohupはno hang-upの略です.

nohup command &

バックグラウンド実行後のプロセスの確認

バックグラウンド実行すると,その実行が終了したのかなどプロセスの状況が分からなくなります.
そこで,実行したプロセスの状況を見る方法は幾つかありますが,ひとまず

top -c

と打てば,現在動いているプロセスの一覧とそれらの消費リソースを見ることができます.
また,-cオプションをつけることで,そのプロセスを動かした時のコマンドが全て出てくるので,
簡単に対象のプロセスを探すことができます.

沢山のプロセスが動いているサーバで,対象のプロセスを見つけにくい場合は,
-uオプションで自分のユーザー名を指定すると良いかもしれません.

top -c -u username

MATLAB

MATLAB実行オプション

詳しくはこちらを参照ください.
基本的には,バックグラウンド実行のためによく使うものだけを取り上げます.

モードオプション

  • -nodesktop
    デスクトップを開かずに実行.
  • -nojvm
    JVMソフトウェアなしにMATLABを起動.
    デスクトップ ツールやグラフィックスが使えません(恐らく並列計算なども).
    その分,起動が早くなります.

表示オプション

  • -nodisplay
    MATLABデスクトップを起動せずにJVMソフトウェアを起動.

  • -nosplash
    スプラッシュ スクリーンを非表示.

スクリプトまたは関数の実行

  • -r "hogehoge"
    hogehogeの部分にはdisp()のような関数や,sciript.mのようなスクリプトを置き換えます.
    また,セミコロン;で区切ることで複数のスクリプトまたは関数を実行できます.
    「ダブルクォーテーション“”で囲うこと」と「拡張子.mは書かないこと」に注意してください.

初期作業フォルダ

  • -sd "hogehoge"
    初期作業フォルダを指定.

Linuxの場合,初期作業フォルダはMATLABを起動したフォルダになります.
他のOSの方はこちらを参照.

-nodisplay-nodesktopの違い

グラフィックを表示できる環境の場合,nodisplayの場合はグラフィックが表示されないのに対し,
nodesktopの場合はグラフィックのみが表示されるそうです.→参考
また,どちらの場合でもグラフィック(画像等)の保存はされるようです.

注意点

プログラムの実行がずっと終了しないということが起こりえるため,
コマンドに< /dev/null(Windowsの場合はNUL)か,プログラム内にexitまたはquitをつける必要があります.
ただし,後者の場合エラーが出た場合には,永遠に終了しないということが起きうるようです.詳しくはこちらを参照.

  • < /dev/null を用いる場合
nohup matlab -r 'script' < /dev/null &
  • プログラム内にexitまたはquitをつける場合
nohup matlab -r 'script; exit' &

このように,-rオプションのクオーテーション''内に書くと書きやすいです.
もちろんscript.mの最終行に書いても大丈夫です.

リダイレクト

リダイレクトというのは,プログラムへの入出力は通常ターミナルから(へ)行いますが,
それをファイルから(へ)入出力できるようにすることです.

出力先のリダイレクト

nohupでプログラムを実行すると,デフォルトでは標準出力・標準エラー出力はnohup.outに記述されます.
ここでは,その記述先を変更する方法,および何処にも記述しない方法についてまとめます.
詳しくは他のサイトをご覧ください.

標準出力と標準エラー出力を別ファイルに出力

nohup command > output.log 2>error.log

">"は"1>"と等価で,1は標準出力を,2は標準エラー出力を表しています.

追記する形で,標準出力と標準エラー出力を別ファイルに出力

nohup command >> output.log 2>> error.log

標準出力と標準エラー出力をどこにも記述しない

nohup command >/dev/null 2>&1

標準出力の記述先を"/dev/null"に変更することで記述しないようにしています.
また,"2>&1"は標準出力(1)の記述先を標準エラー出力(2)の記述先に設定するということを表しており,
結果的にどちらの出力も記述しないようにしています.

標準入力先のリダイレクト

command < /dev/null

標準入力をnullとしています.
これによって,実行中に入力待ちが発生してプログラムが永遠に終了しないということを防いでいます.