サーバー運用や開発作業では、長時間かかる処理を実行しながら別の作業を進めたい場面が頻繁に発生します。また、SSH接続が切断されても処理を継続させたいというニーズも多くあります。
この記事では、Linuxにおけるジョブ管理とバックグラウンド実行の仕組みを体系的に解説します。基本的なジョブ制御から、セッション切断後も処理を継続させるnohupやdisown、さらにターミナルマルチプレクサであるscreenとtmuxの活用方法までを学びましょう。
前提条件
この記事では以下の環境での動作を確認しています。
| 項目 | バージョン |
|---|---|
| OS | Ubuntu 24.04 LTS / AlmaLinux 9 |
| bash | 5.0以上 |
| screen | 4.9以上 |
| tmux | 3.4以上 |
基本的なLinuxコマンドライン操作およびプロセスの基本概念を理解していることを前提としています。
フォアグラウンドとバックグラウンドの違い
Linuxのシェルで実行されるプロセスは、フォアグラウンドジョブとバックグラウンドジョブの2種類に分類されます。
graph TB
subgraph Terminal["ターミナル"]
subgraph FG["フォアグラウンド"]
FGJob["実行中のジョブ<br>(入力を受け付ける)"]
end
subgraph BG["バックグラウンド"]
BGJob1["ジョブ1"]
BGJob2["ジョブ2"]
BGJob3["ジョブ3"]
end
end
User["ユーザー入力"] --> FGJob
style FG fill:#e3f2fd,stroke:#1976d2
style BG fill:#f3e5f5,stroke:#7b1fa2フォアグラウンドジョブの特徴
フォアグラウンドジョブは、ターミナルを占有して実行されるプロセスです。
| 特徴 | 説明 |
|---|---|
| 入出力の独占 | キーボード入力を受け取り、画面に出力を表示 |
| 制御の占有 | 実行中は他のコマンドを入力できない |
| シグナル受信 | Ctrl+Cで中断、Ctrl+Zで一時停止が可能 |
通常、コマンドを実行するとフォアグラウンドで起動します。
|
|
バックグラウンドジョブの特徴
バックグラウンドジョブは、ターミナルの制御を解放しながら裏側で実行されるプロセスです。
| 特徴 | 説明 |
|---|---|
| 非対話型 | キーボード入力を受け付けない |
| 並行実行 | 他のコマンドと同時に実行可能 |
| 出力の表示 | 標準出力・標準エラー出力はターミナルに表示される |
バックグラウンドでの起動方法
アンパサンド(&)を使った起動
コマンドの末尾に&を付けることで、最初からバックグラウンドで起動できます。
|
|
実行結果の例:
[1] 12345
この出力は「ジョブ番号1、プロセスID 12345」を意味します。
複数のコマンドをバックグラウンドで起動することも可能です。
|
|
標準出力・標準エラー出力のリダイレクト
バックグラウンドジョブの出力がターミナルに表示されると作業の邪魔になることがあります。リダイレクトを組み合わせて出力を制御しましょう。
|
|
ジョブ制御コマンド
シェルはジョブ単位でプロセスを管理しており、複数のジョブ制御コマンドを提供しています。
Ctrl+Zによる一時停止
フォアグラウンドで実行中のジョブは、Ctrl+Zを押すことで一時停止(サスペンド)できます。
|
|
実行結果の例:
^Z
[1]+ Stopped find / -name "*.log" 2>/dev/null
一時停止したジョブはメモリに残りますが、CPUは使用しません。
jobsコマンドでジョブ一覧を表示
現在のシェルセッションで管理しているジョブの一覧をjobsコマンドで確認できます。
|
|
実行結果の例:
[1]- Stopped find / -name "*.log" 2>/dev/null
[2]+ Running sleep 300 &
jobsコマンドの出力形式を以下の表で説明します。
| 要素 | 意味 |
|---|---|
| [1] | ジョブ番号 |
| + | カレントジョブ(最後に操作したジョブ) |
| - | 前のジョブ |
| Stopped | 一時停止中 |
| Running | バックグラウンドで実行中 |
オプションを使ってより詳細な情報を表示できます。
|
|
実行結果の例:
[1]- 12345 Stopped find / -name "*.log" 2>/dev/null
[2]+ 12346 Running sleep 300 &
fgコマンドでフォアグラウンドに戻す
一時停止中やバックグラウンドで実行中のジョブをフォアグラウンドに戻すにはfgコマンドを使用します。
|
|
ジョブ指定の書式には以下のバリエーションがあります。
| 書式 | 意味 |
|---|---|
| %N | ジョブ番号Nを指定 |
| %+ または %% | カレントジョブ |
| %- | 前のジョブ |
| %string | コマンド名がstringで始まるジョブ |
| %?string | コマンドにstringを含むジョブ |
bgコマンドでバックグラウンドで再開
一時停止中のジョブをバックグラウンドで再開するにはbgコマンドを使用します。
|
|
これは、フォアグラウンドで誤って起動してしまった長時間処理を、後からバックグラウンドに移動させる場合に便利です。
実践的なワークフロー
以下は、ジョブ制御を活用した典型的なワークフローです。
|
|
セッション切断後も処理を継続する方法
バックグラウンドジョブには重要な制限があります。SSHセッションを切断したり、ターミナルを閉じたりすると、そのセッションに紐づくジョブにHUP(ハングアップ)シグナルが送信され、通常はジョブが終了してしまいます。
sequenceDiagram
participant User as ユーザー
participant SSH as SSHセッション
participant Shell as シェル
participant Job as バックグラウンドジョブ
User->>SSH: 切断
SSH->>Shell: SIGHUP送信
Shell->>Job: SIGHUP転送
Job->>Job: 終了この問題を解決する方法を見ていきましょう。
nohupコマンド
nohup(no hang up)は、HUPシグナルを無視してコマンドを実行するためのユーティリティです。
|
|
実行結果の例:
[1] 12345
nohup: ignoring input and appending output to 'nohup.out'
nohupの動作を以下の表にまとめます。
| 項目 | 動作 |
|---|---|
| 標準入力 | /dev/nullにリダイレクト(入力を無視) |
| 標準出力 | nohup.outファイルに追記 |
| 標準エラー出力 | 標準出力と同じファイルに追記 |
| HUPシグナル | 無視される |
出力ファイルを指定する場合は明示的にリダイレクトします。
|
|
disownコマンド
disownは、既に実行中のジョブをシェルのジョブテーブルから切り離すbash組み込みコマンドです。これにより、シェル終了時にHUPシグナルが送信されなくなります。
|
|
nohupとdisownの違いを理解しておきましょう。
| 項目 | nohup | disown |
|---|---|---|
| 使用タイミング | コマンド実行時 | 実行後いつでも |
| 出力の扱い | 自動でnohup.outに保存 | 変更なし |
| ジョブ一覧 | jobsで表示される | jobsから消える |
| シェルの種類 | POSIXシェル共通 | bash/zsh等の拡張 |
バックグラウンドジョブの確認
nohupやdisownで切り離したジョブはjobsでは表示されません。psコマンドで確認します。
|
|
ターミナルマルチプレクサの活用
より高度なセッション管理には、ターミナルマルチプレクサを使用します。ターミナルマルチプレクサは、1つのターミナルで複数の仮想端末を管理し、セッションのデタッチ(切り離し)とアタッチ(再接続)を可能にします。
screenの基本
screenはGNU Projectによる歴史あるターミナルマルチプレクサです。
graph TB
subgraph Session["screenセッション"]
subgraph Windows["ウィンドウ"]
W0["Window 0<br>bash"]
W1["Window 1<br>vim"]
W2["Window 2<br>top"]
end
end
Terminal1["ターミナル1"] -.->|attach| Session
Terminal2["ターミナル2"] -.->|detach後<br>attach可能| Session
style Session fill:#e8f5e9,stroke:#388e3cセッションの作成と管理
|
|
実行結果の例:
There are screens on:
12345.mysession (Detached)
12346.pts-0.hostname (Attached)
2 Sockets in /run/screen/S-username.
基本的なキー操作
screenのコマンドは、プレフィックスキーCtrl+aに続けて入力します。
| キー操作 | 説明 |
|---|---|
| Ctrl+a d | セッションをデタッチ(切り離し) |
| Ctrl+a c | 新しいウィンドウを作成 |
| Ctrl+a n | 次のウィンドウに切り替え |
| Ctrl+a p | 前のウィンドウに切り替え |
| Ctrl+a 数字 | 指定番号のウィンドウに切り替え |
| Ctrl+a w | ウィンドウ一覧を表示 |
| Ctrl+a k | 現在のウィンドウを終了 |
| Ctrl+a ? | ヘルプを表示 |
| Ctrl+a [ | コピーモード(スクロールバック) |
セッションへの再接続
|
|
画面分割
screenは画面を分割して複数のウィンドウを同時に表示できます。
| キー操作 | 説明 |
|---|---|
| Ctrl+a S | 水平分割 |
| Ctrl+a | | 垂直分割 |
| Ctrl+a Tab | 次のリージョンに移動 |
| Ctrl+a X | 現在のリージョンを削除 |
| Ctrl+a Q | 現在のリージョン以外を削除 |
tmuxの基本
tmuxは現代的なターミナルマルチプレクサで、screenの代替として広く使われています。最新の安定版は3.6aです(2025年時点)。
graph TB
subgraph Server["tmuxサーバー"]
subgraph Session1["セッション: dev"]
subgraph Window1["ウィンドウ1"]
P1["Pane 1"]
P2["Pane 2"]
end
subgraph Window2["ウィンドウ2"]
P3["Pane 3"]
end
end
subgraph Session2["セッション: logs"]
subgraph Window3["ウィンドウ1"]
P4["Pane 1"]
end
end
end
Client["クライアント"] -.->|attach| Session1
style Server fill:#fff3e0,stroke:#f57c00セッションの作成と管理
|
|
基本的なキー操作
tmuxのコマンドは、プレフィックスキーCtrl+bに続けて入力します。
| キー操作 | 説明 |
|---|---|
| Ctrl+b d | セッションをデタッチ |
| Ctrl+b c | 新しいウィンドウを作成 |
| Ctrl+b n | 次のウィンドウに切り替え |
| Ctrl+b p | 前のウィンドウに切り替え |
| Ctrl+b 数字 | 指定番号のウィンドウに切り替え |
| Ctrl+b w | ウィンドウ一覧を表示(選択可能) |
| Ctrl+b , | 現在のウィンドウの名前を変更 |
| Ctrl+b & | 現在のウィンドウを終了(確認あり) |
| Ctrl+b ? | キーバインド一覧を表示 |
| Ctrl+b [ | コピーモード |
ペイン操作
tmuxはウィンドウ内をペインに分割できます。
| キー操作 | 説明 |
|---|---|
| Ctrl+b % | 垂直分割 |
| Ctrl+b " | 水平分割 |
| Ctrl+b 矢印キー | ペイン間を移動 |
| Ctrl+b o | 次のペインに移動 |
| Ctrl+b z | 現在のペインを最大化/元に戻す |
| Ctrl+b x | 現在のペインを終了(確認あり) |
| Ctrl+b { | ペインを前に移動 |
| Ctrl+b } | ペインを後ろに移動 |
| Ctrl+b Ctrl+矢印 | ペインのリサイズ |
コマンドラインからの操作
tmuxはコマンドラインから直接操作することもできます。
|
|
screenとtmuxの比較
| 項目 | screen | tmux |
|---|---|---|
| 開発状況 | 安定(メンテナンスモード) | 活発に開発中 |
| 設定ファイル | ~/.screenrc | ~/.tmux.conf |
| プレフィックスキー | Ctrl+a | Ctrl+b |
| ペイン対応 | 限定的(リージョン) | 充実 |
| スクリプト連携 | 可能 | より柔軟 |
| ステータスバー | 基本的 | 高度なカスタマイズ可能 |
| デフォルトのインストール | 多くのディストリで標準 | 追加インストールが必要な場合あり |
新規に導入する場合はtmuxをおすすめしますが、screenも十分に実用的です。
実践的な活用例
長時間ビルドの実行
|
|
サーバーメンテナンス作業
|
|
バッチ処理の夜間実行
|
|
リモートサーバーでのデータ転送
|
|
トラブルシューティング
ジョブが見つからない場合
|
|
screenセッションに接続できない場合
|
|
tmuxサーバーに接続できない場合
|
|
まとめ
この記事では、Linuxにおけるジョブ管理とバックグラウンド実行について解説しました。
| 目的 | 推奨される方法 |
|---|---|
| 一時的なバックグラウンド実行 | コマンド末尾に& |
| 実行中のジョブをバックグラウンドへ | Ctrl+Z → bg |
| セッション切断後も継続(単発) | nohup または disown |
| セッション管理が必要 | screen または tmux |
| 複雑なマルチタスク | tmux(推奨) |
長時間実行タスクを効率的に管理することで、サーバー運用の生産性が大きく向上します。特にtmuxは、リモートサーバーでの作業において必須のツールと言えるでしょう。
参考リンク
- GNU Screen Manual - GNU Screen公式マニュアル
- tmux Wiki - tmux公式Wiki
- tmux(1) Manual Page - tmux公式マニュアルページ
- Bash Reference Manual - Job Control - Bash公式ドキュメントのジョブ制御セクション