[初心者向け]時間のかかる処理を中断せずに実行したいときは、EC2インスタンス上でtmuxを使ってみよう

tmux(Terminal Multiplexer)でセッションを維持しよう
2023.09.13

データアナリティクス事業本部インテグレーション部コンサルティングチーム、新納(にいの)です。

みなさんは時間のかかるコマンドやプログラムを実行している時に、SSHログアウトされたりセッションが切れてしまったりしてもう一度やり直し…という悲劇に見舞われたことはありませんか?私はあります。

先日、大量のファイルを処理する関係で処理に数日かかるPythonスクリプトを実行する機会があり、その際にtmux(Terminal Multiplexer)を利用する機会がありましたので、使い方をまとめてみました。

tmuxとは

tmuxとはTerminal Multiplexerの略称で、仮想環境を複数作成でき、複数のターミナル画面を開いたり画面を分割したりできます。大きな利点はターミナルを終了したとしてもセッションは維持されるところです。前回の状態から再開できるため、実行時間が長いプログラムを実行中なんらかの拍子にセッションが切れて中断しまうトラブルを避けたり、「この処理をしている間に別の処理を実行しておきたい」なんてことができたりします。

環境作成

今回はEC2インスタンスtmuxを実行します。利用した環境は以下の通り。

  • EC2インスタンス
    • OS:Amazon Linux 2023
    • AMI:al2023-ami-2023.1.20230906.1-kernel-6.1-arm64
    • インスタンスタイプ:t4g.small

このEC2インスタンスへSSHアクセスしてtmuxを実行するのですが、今回はセッションマネージャー経由でSSH接続します。セッションマネージャーを経由してSSHアクセスすると以下のようなメリットがあります。

  • IAMでの認証ができ、EC2インスタンスのキーペアを使わずSSHアクセス可能
  • セキュリティグループでのSSHポートへのインバウンドアクセス許可設定が不要

つまり、よりセキュアなSSHアクセスが可能です。セッションマネージャーを利用するためにはIAMポリシーAmazonSSMManagedInstanceCoreがアタッチされたIAMロール、そしてEC2インスタンスがプライベートサブネットにある場合は以下のVPCエンドポイントが必要となります。

  • com.amazonaws.region.ssm
  • com.amazonaws.region.ec2messages
  • com.amazonaws.region.ssmmessages
  • com.amazonaws.region.s3

セッションマネージャーを利用できるEC2インスタンスを作成可能なCloudFormationテンプレートが以下のブログで公開されていますので参考にしてください。

tmuxを実行する

上記でtmuxを使う準備が整ったので早速実行したいところですが、その前にユーザーを切り替えておきます。

ec2-userに切り替える

セッションマネージャーに接続した直後はデフォルトでssm-userが使われています。

実際にこのユーザーはログインしているのではなく、シェアルアクセスをしている状態です。このままだとカレントディレクトリが/usr/binだったりといろいろと使い勝手が悪いので、以下のコマンドでAmazon Linuxのデフォルトユーザーであるec2-userに切り替えます。

sudo su -  ec2-user

もっと詳しく知りたい方は以下のブログをご参照ください。

インストール

以下のコマンドを実行し、tmuxのインストールを実施します。

sudo yum install tmux

インストールが成功したら以下のように表示されます。

Last metadata expiration check: 0:32:02 ago on Tue Sep 12 10:16:00 2023.
Dependencies resolved.
==========================================================================================================================================================================
 Package                           Architecture                         Version                                            Repository                                Size
==========================================================================================================================================================================
Installing:
 tmux                              aarch64                              3.2a-3.amzn2023.0.2                                amazonlinux                              466 k

Transaction Summary
==========================================================================================================================================================================
Install  1 Package

Total download size: 466 k
Installed size: 1.1 M
Is this ok [y/N]: y
Downloading Packages:
tmux-3.2a-3.amzn2023.0.2.aarch64.rpm                                                                                                      3.1 MB/s | 466 kB     00:00
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                     2.3 MB/s | 466 kB     00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                                                                  1/1
  Installing       : tmux-3.2a-3.amzn2023.0.2.aarch64                                                                                                                 1/1
  Running scriptlet: tmux-3.2a-3.amzn2023.0.2.aarch64                                                                                                                 1/1
  Verifying        : tmux-3.2a-3.amzn2023.0.2.aarch64                                                                                                                 1/1

Installed:
  tmux-3.2a-3.amzn2023.0.2.aarch64

Complete!

セッションを作成する(アタッチする)

インストールができたらセッションを作成してみましょう。以下コマンドで名前付きのセッションを作成できます。

tmux new -s 名前

作成されたと同時にセッションの中に入った状態になります。処理したいプログラムはこのセッションの中に配置して実行可能です。

セッションをリストする

今回はsession1session2というセッションを2つ作成しました。存在するセッションのリストを取得するにはtmux lsを実行します。以下のようにリストが表示されます。

$ tmux ls
session1: 1 windows (created Tue Sep 12 10:25:08 2023)
session2: 1 windows (created Tue Sep 12 10:25:46 2023)

セッションから抜ける(デタッチする)

セッションを作成した段階でセッションの中に入っている状態ですが、セッションを抜けるにはctrl + Bを押したあとにDを押します。同時に押すのではなく、ctrl + Bを押したあとにDを押すのでお間違えなく。ちなみにctrl + Dを押すとセッションが削除されますので気をつけてください!

セッションを抜けると以下のようなメッセージが表示されます。

[detached (from session session1)]

作成済みのセッションに再び入る

セッションに再び入るには以下のコマンドを実行します。

tmux a -t 名前

セッションを削除する

上述しましたが、セッションに入った状態でctrl + Dを押すとセッションが削除されます。削除されると以下のメッセージが表示されます。

[exited]

さいごに

長い処理を中断させずに実行するためのtmuxの使い方をご紹介しました。このエントリで紹介した使い方ももちろん便利なのですが、ローカルPCに導入しても複数ターミナル画面を開いて分割して便利に使えます。やり方は参考リンクをぜひご参照ください。

参考資料