Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】服务器 tmux 持久化问题

2025年09月20日に「Dev.to」が公開したITニュース「服务器 tmux 持久化问题」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

SSH接続が切れると、作業中のターミナル画面(tmux)まで終了してしまう問題。systemdを使ってtmuxセッションをサーバー上で永続化する設定を行えば、接続し直しても中断した作業をすぐに再開できる。

出典: 服务器 tmux 持久化问题 | Dev.to公開日:

ITニュース解説

この解説では、遠隔地のサーバーで作業するシステムエンジニア初心者が直面する可能性のある「tmuxセッションの永続化」に関する問題と、その効果的な解決策について詳しく説明する。まず、今回のニュース記事が扱っている状況の背景から理解していこう。

私たちは通常、SSH(Secure Shell)という仕組みを使って、自分の手元にあるパソコンから、遠く離れた場所にあるサーバーに安全に接続し、コマンドを実行したり、プログラムを動かしたりする。このSSH接続は、暗号化された安全な通信路を提供し、サーバーの操作を可能にする。

しかし、SSH接続が途切れてしまうと、その接続を通じて実行していたプログラムも停止してしまうのが一般的だ。長時間かかる計算処理や、複数の操作を同時に行う必要がある場合、これは非常に不便である。そこで登場するのが「tmux(ティーマックス)」というツールだ。tmuxは「ターミナルマルチプレクサ」と呼ばれ、一つのSSH接続の中で複数の仮想的なターミナルセッションを作成し、それらを切り替えたり、分割して同時に表示したりできる。そして最も重要なのが、SSH接続が切断されても、tmuxセッション自体はサーバー上で生き残り続けるという点だ。これにより、次回SSH接続した際に、前回中断した作業をそのまま再開できる。これはシステムエンジニアにとって、作業効率を大幅に向上させる非常に強力な機能だ。

ニュース記事では、通常はSSHを切断してもtmuxセッションが生き残るはずなのに、ある日突然、SSHを切断するとtmuxセッションも一緒に終了してしまうという問題が発生したと報じている。これは、特に学校のHPC(高性能計算クラスター)のような、計算資源を共有し、長時間かかる複雑な処理を行う環境では致命的な問題だ。HPCでは、数時間から数日かかるような計算が日常的に行われるため、途中でセッションが切断されてしまうと、全ての作業が無駄になってしまう可能性がある。

この問題の原因として、SSH接続が切断された際に、サーバーがその接続に関連するバックグラウンドのプロセス(今回はtmux)を自動的に終了させている可能性が挙げられている。つまり、サーバー側で何らかの設定変更があったか、または特定の環境下でそのような挙動が起きるようになった、と推測できる。

この厄介な問題を解決するために、ニュース記事では「systemd(システムディー)」という仕組みを利用する方法を提案している。systemdは、Linuxシステムでプログラムやサービスを管理するための非常に強力なシステムで、OSの起動と同時にさまざまなサービスを立ち上げたり、停止したり、監視したりする役割を担っている。通常はシステム全体に関わるサービスを管理するが、今回は「ユーザーサービス」という形で、特定のユーザーのログインセッションに紐づくサービスを管理するために利用する。

具体的な解決策は、~/.config/systemd/user/tmux@.serviceという新しいファイルを作成することから始まる。このファイルはsystemdに対して、tmuxセッションをどのように管理すべきかを指示する「設定ファイル」である。ファイルの中身を一つずつ見ていこう。

まず、[Unit]セクションだ。

  • Description=Tmux session %i: このサービスの説明を設定する。%iの部分には、実際にサービスを起動する際に指定する名前(今回はmain)が入る。
  • After=default.target: このサービスが、ユーザーのデフォルトセッションターゲットが起動した後(つまり、ユーザーがログインして基本的な環境が整った後)に開始されるべきであることを示す。

次に、[Service]セクションだ。ここがサービス本体の動作を定義する最も重要な部分である。

  • Type=forking: サービスが開始されると、親プロセスがすぐに終了し、子プロセスがバックグラウンドで動作し続けるタイプのサービスであることをsystemdに伝える。tmuxはまさにこのタイプで動作するため、この設定が必要となる。
  • ExecStart=/usr/bin/tmux new-session -d -s %i: サービスが開始されたときに実行されるコマンドだ。
    • /usr/bin/tmux: tmuxコマンドの実行ファイルへのパス。
    • new-session: 新しいtmuxセッションを作成するコマンド。
    • -d: セッションを作成した後、すぐにデタッチ(分離)してバックグラウンドで実行するオプション。これにより、ターミナルが占有されずにコマンドが完了する。
    • -s %i: 作成するセッションの名前を指定する。ここでも%iがセッション名(main)に置き換えられる。
  • ExecStop=/usr/bin/tmux kill-session -t %i: サービスが停止されたときに実行されるコマンドだ。指定された名前のtmuxセッションを終了させる。
  • Restart=always: 何らかの理由でサービスが予期せず終了してしまった場合、常に自動で再起動するように設定する。これにより、意図しないセッションの終了から保護され、永続性が確保される。
  • WorkingDirectory=%h: サービスが実行される際の作業ディレクトリを、ユーザーのホームディレクトリ(%hで表される)に設定する。

最後に、[Install]セクションだ。

  • WantedBy=default.target: このサービスが、ユーザーのデフォルトセッションターゲットによって「望まれている」(つまり、自動で起動されるべき)サービスであることを示す。systemctl --user enableコマンドを実行した際に、この設定に基づいて適切なシンボリックリンクが作成され、ユーザーログイン時にサービスが自動で開始されるようになる。

この設定ファイルを作成したら、以下のコマンドを実行してsystemdにサービスを認識させ、起動させる。

  • systemctl --user enable tmux@main: このコマンドは、作成したtmux@.serviceファイルをユーザーサービスとして有効化する。--userオプションは、システム全体ではなく、現在ログインしているユーザー専用のサービスとして扱うことを指示する。enableは、このサービスがユーザーログイン時に自動で開始されるようにシステムに登録する。tmux@mainmainは、%iに入るセッション名であり、これによってtmux@.servicemainというセッション名で動作するようになる。
  • systemctl --user start tmux@main: このコマンドは、登録したtmux@mainサービスを即座に開始する。enableコマンドだけでは、次回のログインから自動開始されるようになるだけで、すぐにサービスが開始されるわけではないため、このstartコマンドが必要となる。

これらの設定とコマンド実行が完了すれば、以後は非常にシンプルになる。いつでも好きなときにサーバーにSSH接続し、tmux attach -t mainというコマンドを実行するだけで、以前の作業状態が保存されたtmuxセッションに再接続できる。たとえSSH接続が不意に切断されてしまっても、サーバーがダウンしない限り、あなたの作業は守られ、次回から中断した箇所をすぐに再開できるのだ。

このように、systemdのユーザーサービスとしてtmuxを管理することで、SSH接続の安定性に依存せず、恒久的に作業セッションを維持できるようになる。これは、システムエンジニアが遠隔地のサーバーで安心して作業を進める上で、非常に基本的ながらも強力なテクニックとなるだろう。この仕組みを理解し、活用することで、あなたはより効率的でロバストな開発環境を構築できるようになるはずだ。

関連コンテンツ