チュートリアル

SSH 切断後もプロセスを動かし続ける(tmux、nohup)

SSH を閉じると SIGHUP で実行中のコマンドが終了します。tmux や screen の中で実行して生かし続け、後で再アタッチするか、起動して放置するなら nohup を使いましょう。接続が切れるモバイルでこれがなぜ二重に重要なのか。

CC Chen Chen· 創業者·2026年6月24日·5 分で読めます

切断してもプロセスを動かし続ける

デフォルトでは、SSH セッションを閉じると、その中で起動したものは何でも終了します。切断した後もコマンドを動かし続けるには、ターミナルマルチプレクサ ── tmux(または screen)── の中で起動しましょう。これが最良で最も柔軟な選択肢です。単発の用途なら nohup … & でも構いません。モバイルではこれが二重に重要です。ネットワークを切り替えたりアプリがバックグラウンドに回ったりすると接続が切れるので、デタッチするかどうかがジョブを失うか失わないかの分かれ目になります。

なぜ死ぬのか

SSH セッションが終わると、シェルは子プロセスに SIGHUP(「ハングアップ」)を送り、ほとんどが終了します。解決策は、セッションを生き延びる場所でプロセスを実行することです ── デタッチした tmux/screen セッション、または明示的にハングアップを無視するよう指示されたプロセスです。

最良の方法:tmux

tmux は接続とは独立してサーバー上にシェルを生かし続けます。起動して、作業を実行し、デタッチして、切断する ── 作業は続きます。後で、離れたところとまったく同じ場所に再アタッチできます。

tmux                      # 启动一个会话
# … 跑你的长命令 …
# 分离:按 Ctrl-b 再按 d
# 现在可以安全断开

# 稍后重连后:
tmux attach               # 正好回到你离开处

複数のセッションがある場合:tmux ls で一覧表示し、tmux attach -t 0 で 1 つを選びます。screen は古い同等品です(screen、デタッチは Ctrl-a d、再アタッチは screen -r)── インストールされている方を使ってください。

手早い方法:nohup

起動して放っておきたい単一のコマンドには:

nohup ./long_job.sh > job.log 2>&1 &

nohup はプロセスにハングアップを無視させ、& はバックグラウンドに回し、リダイレクトは出力をファイルにキャプチャします(出力を表示するターミナルがないため)。後で tail -f job.log で進捗を確認します。すでにコマンドを起動してしまってから気づいた?disown -h %1 は直近のバックグラウンドジョブをシェルからデタッチし、生き延びさせます。

どれを使うべきか?

やりたいこと…使うもの
戻ってきてセッションと対話したいtmux / screen
1 つのコマンドを起動して放置、後でログを見るnohup … &
すでに起動したジョブを救いたいdisown

なぜこれがモバイルで欠かせないのか

スマホでは、接続は本質的に脆弱です。Wi-Fi の圏外に出る、モバイル回線に切り替わる、あるいは長い待ち時間の間に OS がアプリをサスペンドする ── すると素の SSH セッション(と実行中のコマンド)は死に、しばしば broken pipe を伴います。tmux の中で実行すれば、切断はどうでもない出来事になります。ジョブはサーバー上で動き続け、再接続したら tmux attach で再アタッチできます。安定したアドレス(Tailscale)と組み合わせれば、再接続はワンタップです。これがスマホ管理を信頼できるものにする習慣です。

スマホ上で tmux コマンドを提案する TermAI
モバイルでは、長い作業を tmux の中で始めれば、接続が切れてもジョブは死にません ── 再接続したら再アタッチするだけ。コマンドに自信がなければ AI が設定してくれます。

よくある質問

SSH を閉じた後もプロセスを動かし続けるには?
tmux(または screen)の中で起動し、Ctrl-b の後 d でデタッチして、切断します ── プロセスは動き続けます。後で tmux attach で再アタッチします。単発なら nohup command & を使います。

tmux と nohup の違いは?
tmux は再アタッチできる対話的なセッションを生かし続けます。nohup はハングアップを無視してバックグラウンドで動く 1 つのコマンドを起動するだけです。セッションに戻りたいときは tmux を使ってください。

すでにコマンドを起動してしまった ── 救えますか?
はい:disown -h %1 は実行中のバックグラウンドジョブをデタッチし、セッションを生き延びさせます。(それはすでにバックグラウンドにある必要があります ── Ctrl-z の後 bg で、または & で起動して。)

モバイルで SSH が切れるとなぜジョブが死ぬのか?
切断されたセッションはプロセスに SIGHUP を送ります。tmux の中で実行して接続から独立させましょう ── 切断が頻繁なモバイルでは欠かせません。

クイックファクト

  • なぜジョブが死ぬか:SSH を閉じると子プロセスに SIGHUP が送られる
  • 最良:tmux で実行 ── デタッチ(Ctrl-b d)、切断、後で tmux attach
  • 手早く:nohup command > log 2>&1 & で起動して放置
  • すでに実行中:disown -h %1 で救う
  • モバイル:tmux は切断をどうでもない出来事に変える
Try TermAI

Free on iOS and Android. 5 AI requests/day on the free tier, plus unlimited SSH/SFTP and built-in Tailscale.

CC
Chen Chen — Founder of TermAI

Writes about mobile DevOps, terminal UX, and the surprising depth of "boring" infrastructure.

Was this useful? ← Back to blog