【AWS EC2】EC2でログアウト後もスクリプトをバックグラウンド実行する

#JavaScript
writtdden by ま。

こんにちは、ま。です

EC2インスタンスにSSHで接続してスクリプトを実行する時、さっと終わるような処理ならいいのですが、数時間、ものによっては数日かかるような膨大なデータを処理するような場面もあると思います。

その間ずっとSSHしてても意味ないですし、一定時間操作がないと勝手にログアウトされて処理が停止してしまったりしますので、その対策としてログアウトしても実行してくれるようなコマンドを今回は紹介します。

結論: nohup

nohup 実行コマンド &

シンプルで簡単素晴らしい!

&はバックグラウンドの&です。
他に環境構築しておくものなどはありません。EC2デフォルトで利用できます。

確認

何はともあれ実行してみるが一番手っ取り早いのでお困りの方は試していただければと思いますが、
一応どうなるのか書いておきます。

まずサンプルで作ったフォルダ構成です

[ec2-user@ip-xxx-xx-xx-xx sample]$ ls -la
合計 3 
drwxr-xr-x 3 ec2-user ec2-user 30 11月 8 13:03 . 
drwxr-xr-x 7 ec2-user ec2-user 174 11月 8 13:03 .. 
-rw-rw-r-- 4 ec2-user ec2-user 204 11月 8 13:04 sample_script.py

スクリプトは実行し続けたいものならなんでもいいのでPythonにしました。
中身は時間を毎秒Printするだけ。

import datetime
import time

def main():
 while(1):
  dt = datetime.datetime.now()
  print(dt)
  time.sleep(1)

if __name__ == "__main__":
 main()

実行します!

[ec2-user@ip-xxx-xx-xx-xx sample]$ nohup python sample_script.py &
[1] 7958
[ec2-user@ip-xxx-xx-xx-xx sample]$ nohup: 入力を無視し、出力を `nohup.out' に追記します

そうすると、実行IDとnohup.outに追記しますとの表示が出ます。
nohup.outはログファイルと思っていただければOKです。通常実行した時にコンソールに出るような内容がここに記載されるだけです。

今回は時間が列挙されています。

[ec2-user@ip-xxx-xx-xx-xx sample]$ tail nohup.out 
2022-11-08 13:15:34.915017
2022-11-08 13:15:35.915578
2022-11-08 13:15:36.916725
2022-11-08 13:15:37.917892
2022-11-08 13:15:38.919022
2022-11-08 13:15:39.919576
2022-11-08 13:15:40.920710
2022-11-08 13:15:41.921837
2022-11-08 13:15:42.922955

さて最後にログアウトの確認です。まずはログアウトする前にpsコマンドで実行状態を確認しておきます。

[ec2-user@ip-xx-xx-xx-xx sample]$ ps
PID TTY TIME CMD
7846 pts/1 00:00:00 bash
7958 pts/1 00:00:00 python
7971 pts/1 00:00:00 ps

実行時に通知されたIDで実行されていることがわかります。
では一旦exitしてログアウト、そして再接続してもう一度psコマンドで確認します。

[ec2-user@ip-xx-xx-xx-xx ~]$ ps
PID TTY TIME CMD
8000 pts/1 00:00:00 bash
8021 pts/1 00:00:00 ps

ここでは存在してません。
しかしご安心を。psコマンドはデフォルトだとこのセッションで実行されているプロセスを表示してくれるので、オプションをつけて全体のプロセス状況を確認してみます。ps aux です。

[ec2-user@ip-xxx-xx-xx-xx ~]$ ps aux
ec2-user 7958 0.0 0.6 136672 6428 ? S 02:13 0:00 python sample_script.py

※他の実行状況とかも混在するので、対象の一行だけ抜粋

いましたね。先程のnohup.outも更新されています。

[ec2-user@ip-xxx-xx-xx-xx sample]$ tail nohup.out 
2022-11-08 13:25:42.604279
2022-11-08 13:25:43.605451
2022-11-08 13:25:44.606640
2022-11-08 13:25:45.607804
2022-11-08 13:25:46.608943
2022-11-08 13:25:47.610051
2022-11-08 13:25:48.611176
2022-11-08 13:25:49.612298
2022-11-08 13:25:50.613482

10分ほど時が進みました!
しっかり実行してくれてますね!

まとめ

一応まとめです!

EC2でログアウト後もスクリプトを実行していたい時はnohupコマンド!

ログはnohup.outで確認!

以上!

関連記事

この他のAWS関連記事もぜひ読んでみてください!

AWSについて~EC2の作成~

AWSについて~セキュリティーグループの作成~

Favorite