AWS関連

【AWS】ログアウトしてもEC2でスクリプト実行を続けたいときは”nohup”

EC2 にSSH 接続していて、ちょっと重めのスクリプト実行したい。

そして、処理の完了を待たずにSSH 接続を終了したい。(端末を閉じて移動したい、寝たい、等)

こんな状況ありませんか?ないですか?そうですか、私にはありました。

そんなとき出会ったのが「nohup」コマンド。

こいつのおかげで救われた場面が何度かありましたので、感謝の意味を込めて(誰に)今回はブログに書き残しておこうと思います。

では早速。

nohup コマンドは、どんなときに使えるの?

前述の通り、EC2 にSSH 接続していてスクリプト実行したまま端末を閉じたいときに使えます

特に時間のかかるスクリプトを実行していると、セッション切れが原因で「気がついたら接続切れてた(スクリプトが途中で止まってた)」なんてこともあるので、そんな絶望を味わいたくないときに「nohup」コマンドは有効です。

詳細は後述しますが、「nohup」コマンドは端末を閉じたりログアウトしたりしても、それを無視して処理を続行させることが可能です。

実際つかってみよう!

細かい話は置いといて、とりあえず使ってみることをオススメします。

使い方は簡単なので、速攻モノにできると思います。

実行する

# 書式
nohup 実行したいコマンド &

("&" によりバックグラウンド実行となる)

実行したいコマンドの頭に「nohup」を入れることで、(端末を閉じる、ログアウトする等の)終了を無視して処理を継続してくれます。

また、カレントディレクトリに nohup.out ファイルが作成され、実行結果(標準出力の内容)が追記されていく仕組みとなります。

超絶シンプルでめっちゃ使える予感しかしませんね。

実行状況を確認する

「とりあえず使ってみましょう」とは言ったものの、初めて使うコマンド使うのって結構ハードル高いですよね。

「ログアウトしても処理実行します」って言われても、ホントかよ〜ってなりますよね。

わかります。

処理の進行状況確認したいですよね。

もちろん、ご確認いただけます。(別に nohup コマンドの機能ではないですが。。w)

そんなときはシンプルに、出力先の nohup.out ファイルをを監視モードでチェックしたらよいのです。(ベテラン勢の方々は「そりゃそうだろ」と思うかもしれませんが、念のため書いておきます。)

下記コマンドを利用することにより、 nohup.out ファイルへの書き込み状況(つまり処理の進行状況)をリアルタイムで確認することが可能です。

# 状況確認用のコマンド
tail -f nohup.out
または
less +F nohup.out

特に「less +F」を利用したコマンドは、以下のようなメリットがありオススメです。

  • 「Ctrl-c」で通常の less コマンドと同様の動作になる
  • これにより「/」による検索が可能
  • 「F」を押すことで再びリアルタイム確認が可能

(余談)
less では複数のファイルを同時に指定することができ、「:n」/「:p」を押すことでで 次/前 のファイルへ移動することが可能です。

実行中の処理を停止する

処理を途中で止める方法も、気になりますよね。

方法はいたってシンプル。プロセスを探して、終了(kill)するだけ。

# プロセスの検索
ps aux | grep 実行したコマンド

# プロセスの終了
kill プロセスID

なぜ処理が止まらないの?

使い方も概ね理解できたところですが、

「結局、なぜ nohup 使ったら処理が止まらないの?」

という部分、気になりますよね。

ですよね。私も気になったので少しだけ調べてみました。5分ほど。

「逆に、なぜ処理が止まるのか」を知ると話は早いです。

ログアウトなどにより接続が切れるとき、「HUP シグナル」というものが送られるそうです。

この HUP シグナルにより、制御している端末の終了が伝わり、その端末が実行している処理も停止する、という仕組みになっているのです。

終了時の HUP シグナルでは「SIGHUP」というシグナルが送られるのだとか。シグナルについては、コチラ が参考になりそうです。

そして、nohup コマンドの役割は、「このHUP シグナルを無視する」ためのもの。

つまり、nohup コマンドにより HUP シグナルが無視されるので接続が切れても処理が終了されることがない、ということです。

これ以上のことは調べきれていないのでわかりませんが、ざっくりとした仕組みは分かったのでよしとしましょう。

まとめ

  • 「nohup」コマンドにより端末の接続終了を無視することができる
  • 進捗状況の確認には「less +F」コマンドを利用する
  • 処理を終了させるときはプロセスを探して(psコマンド)終了(killコマンド)する

以上です。

最後まで読んでいただきありがとうございます。