サーバー運用や開発作業では、長時間かかる処理を実行しながら別の作業を進めたい場面が頻繁に発生します。また、SSH接続が切断されても処理を継続させたいというニーズも多くあります。

この記事では、Linuxにおけるジョブ管理とバックグラウンド実行の仕組みを体系的に解説します。基本的なジョブ制御から、セッション切断後も処理を継続させるnohupdisown、さらにターミナルマルチプレクサであるscreentmuxの活用方法までを学びましょう。

前提条件

この記事では以下の環境での動作を確認しています。

項目 バージョン
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
2
# フォアグラウンドで実行(完了まで待機)
sleep 60

バックグラウンドジョブの特徴

バックグラウンドジョブは、ターミナルの制御を解放しながら裏側で実行されるプロセスです。

特徴 説明
非対話型 キーボード入力を受け付けない
並行実行 他のコマンドと同時に実行可能
出力の表示 標準出力・標準エラー出力はターミナルに表示される

バックグラウンドでの起動方法

アンパサンド(&)を使った起動

コマンドの末尾に&を付けることで、最初からバックグラウンドで起動できます。

1
2
# バックグラウンドで起動
sleep 300 &

実行結果の例:

[1] 12345

この出力は「ジョブ番号1、プロセスID 12345」を意味します。

複数のコマンドをバックグラウンドで起動することも可能です。

1
2
3
4
# 複数のバックグラウンドジョブを起動
./script1.sh &
./script2.sh &
./script3.sh &

標準出力・標準エラー出力のリダイレクト

バックグラウンドジョブの出力がターミナルに表示されると作業の邪魔になることがあります。リダイレクトを組み合わせて出力を制御しましょう。

1
2
3
4
5
6
7
8
# 標準出力をファイルにリダイレクト
long_running_task > output.log &

# 標準出力と標準エラー出力の両方をリダイレクト
long_running_task > output.log 2>&1 &

# 出力を完全に破棄
long_running_task > /dev/null 2>&1 &

ジョブ制御コマンド

シェルはジョブ単位でプロセスを管理しており、複数のジョブ制御コマンドを提供しています。

Ctrl+Zによる一時停止

フォアグラウンドで実行中のジョブは、Ctrl+Zを押すことで一時停止(サスペンド)できます。

1
2
3
4
# フォアグラウンドで実行開始
find / -name "*.log" 2>/dev/null

# Ctrl+Zを押す

実行結果の例:

^Z
[1]+  Stopped                 find / -name "*.log" 2>/dev/null

一時停止したジョブはメモリに残りますが、CPUは使用しません。

jobsコマンドでジョブ一覧を表示

現在のシェルセッションで管理しているジョブの一覧をjobsコマンドで確認できます。

1
2
# ジョブ一覧を表示
jobs

実行結果の例:

[1]-  Stopped                 find / -name "*.log" 2>/dev/null
[2]+  Running                 sleep 300 &

jobsコマンドの出力形式を以下の表で説明します。

要素 意味
[1] ジョブ番号
+ カレントジョブ(最後に操作したジョブ)
- 前のジョブ
Stopped 一時停止中
Running バックグラウンドで実行中

オプションを使ってより詳細な情報を表示できます。

1
2
# プロセスIDも表示
jobs -l

実行結果の例:

[1]- 12345 Stopped                 find / -name "*.log" 2>/dev/null
[2]+ 12346 Running                 sleep 300 &

fgコマンドでフォアグラウンドに戻す

一時停止中やバックグラウンドで実行中のジョブをフォアグラウンドに戻すにはfgコマンドを使用します。

1
2
3
4
5
6
7
8
# カレントジョブをフォアグラウンドに
fg

# ジョブ番号を指定してフォアグラウンドに
fg %1

# ジョブ番号2をフォアグラウンドに
fg %2

ジョブ指定の書式には以下のバリエーションがあります。

書式 意味
%N ジョブ番号Nを指定
%+ または %% カレントジョブ
%- 前のジョブ
%string コマンド名がstringで始まるジョブ
%?string コマンドにstringを含むジョブ

bgコマンドでバックグラウンドで再開

一時停止中のジョブをバックグラウンドで再開するにはbgコマンドを使用します。

1
2
3
4
5
# カレントジョブをバックグラウンドで再開
bg

# ジョブ番号を指定してバックグラウンドで再開
bg %1

これは、フォアグラウンドで誤って起動してしまった長時間処理を、後からバックグラウンドに移動させる場合に便利です。

実践的なワークフロー

以下は、ジョブ制御を活用した典型的なワークフローです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 1. 長時間処理をフォアグラウンドで開始
tar -czf backup.tar.gz /home/user

# 2. 思ったより時間がかかりそうなのでCtrl+Zで一時停止
# ^Z
# [1]+  Stopped                 tar -czf backup.tar.gz /home/user

# 3. バックグラウンドで再開
bg %1
# [1]+ tar -czf backup.tar.gz /home/user &

# 4. 別の作業を実行
ls -la

# 5. ジョブの状態を確認
jobs

# 6. 必要に応じてフォアグラウンドに戻す
fg %1

セッション切断後も処理を継続する方法

バックグラウンドジョブには重要な制限があります。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
2
# nohupでコマンドを実行
nohup long_running_task &

実行結果の例:

[1] 12345
nohup: ignoring input and appending output to 'nohup.out'

nohupの動作を以下の表にまとめます。

項目 動作
標準入力 /dev/nullにリダイレクト(入力を無視)
標準出力 nohup.outファイルに追記
標準エラー出力 標準出力と同じファイルに追記
HUPシグナル 無視される

出力ファイルを指定する場合は明示的にリダイレクトします。

1
2
3
4
5
# 出力ファイルを指定
nohup long_running_task > /var/log/task.log 2>&1 &

# 出力を破棄
nohup long_running_task > /dev/null 2>&1 &

disownコマンド

disownは、既に実行中のジョブをシェルのジョブテーブルから切り離すbash組み込みコマンドです。これにより、シェル終了時にHUPシグナルが送信されなくなります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# バックグラウンドジョブを起動
long_running_task &

# ジョブをシェルから切り離す
disown

# または、ジョブ番号を指定
disown %1

# すべてのジョブを切り離す
disown -a

# HUPシグナルを無視するよう設定(切り離しはしない)
disown -h %1

nohupdisownの違いを理解しておきましょう。

項目 nohup disown
使用タイミング コマンド実行時 実行後いつでも
出力の扱い 自動でnohup.outに保存 変更なし
ジョブ一覧 jobsで表示される jobsから消える
シェルの種類 POSIXシェル共通 bash/zsh等の拡張

バックグラウンドジョブの確認

nohupdisownで切り離したジョブはjobsでは表示されません。psコマンドで確認します。

1
2
3
4
5
# 自分のプロセスを表示
ps aux | grep long_running_task

# より詳細な情報
ps -ef | grep long_running_task

ターミナルマルチプレクサの活用

より高度なセッション管理には、ターミナルマルチプレクサを使用します。ターミナルマルチプレクサは、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

セッションの作成と管理

1
2
3
4
5
6
7
8
# 新しいセッションを作成
screen

# 名前を付けてセッションを作成
screen -S mysession

# セッション一覧を表示
screen -ls

実行結果の例:

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 [ コピーモード(スクロールバック)

セッションへの再接続

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# デタッチされたセッションにアタッチ
screen -r

# 名前を指定してアタッチ
screen -r mysession

# 他の場所でアタッチされているセッションを強制的に奪う
screen -d -r mysession

# 存在しなければ作成、あればアタッチ
screen -R mysession

画面分割

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

セッションの作成と管理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 新しいセッションを作成
tmux

# 名前を付けてセッションを作成
tmux new -s mysession

# セッション一覧を表示
tmux ls

# セッションにアタッチ
tmux attach -t mysession

# 短縮形
tmux a -t mysession

基本的なキー操作

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はコマンドラインから直接操作することもできます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 特定のセッションでコマンドを実行
tmux send-keys -t mysession "ls -la" Enter

# 新しいウィンドウを作成してコマンドを実行
tmux new-window -t mysession "htop"

# ペインを分割
tmux split-window -h

# セッションを終了
tmux kill-session -t mysession

screenとtmuxの比較

項目 screen tmux
開発状況 安定(メンテナンスモード) 活発に開発中
設定ファイル ~/.screenrc ~/.tmux.conf
プレフィックスキー Ctrl+a Ctrl+b
ペイン対応 限定的(リージョン) 充実
スクリプト連携 可能 より柔軟
ステータスバー 基本的 高度なカスタマイズ可能
デフォルトのインストール 多くのディストリで標準 追加インストールが必要な場合あり

新規に導入する場合はtmuxをおすすめしますが、screenも十分に実用的です。

実践的な活用例

長時間ビルドの実行

1
2
3
4
5
6
7
# tmuxセッションを作成してビルドを開始
tmux new -s build
make -j$(nproc) all

# Ctrl+b dでデタッチ
# 後で結果を確認
tmux attach -t build

サーバーメンテナンス作業

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 作業用セッションを作成
tmux new -s maintenance

# 画面を分割して複数の作業を並行
# Ctrl+b % で垂直分割
# 左ペイン: ログ監視
tail -f /var/log/syslog

# Ctrl+b 右矢印 で右ペインに移動
# 右ペイン: サービス操作
sudo systemctl restart nginx

バッチ処理の夜間実行

1
2
3
4
5
6
7
8
# nohupを使って夜間バッチを実行
nohup /opt/scripts/nightly_batch.sh > /var/log/batch/$(date +%Y%m%d).log 2>&1 &

# プロセスIDを記録
echo $! > /var/run/batch.pid

# 翌日、ログを確認
tail -f /var/log/batch/$(date +%Y%m%d).log

リモートサーバーでのデータ転送

1
2
3
4
5
6
7
# screenセッション内で大容量ファイル転送
screen -S transfer
rsync -avz --progress /local/data/ remote:/backup/data/

# Ctrl+a dでデタッチして接続を切断しても転送は継続
# 後で進捗を確認
screen -r transfer

トラブルシューティング

ジョブが見つからない場合

1
2
3
4
5
6
7
8
# 自分のすべてのプロセスを確認
ps -u $(whoami)

# 特定のコマンド名で検索
pgrep -a long_running_task

# プロセスツリーで確認
pstree -p $(whoami)

screenセッションに接続できない場合

1
2
3
4
5
6
7
8
# セッションの状態を確認
screen -ls

# 古いセッションをクリーンアップ
screen -wipe

# 権限の問題がある場合
ls -la /run/screen/

tmuxサーバーに接続できない場合

1
2
3
4
5
6
7
8
9
# サーバーが起動しているか確認
pgrep -a tmux

# ソケットファイルを確認
ls -la /tmp/tmux-$(id -u)/

# サーバーを強制終了して再起動
tmux kill-server
tmux new -s new-session

まとめ

この記事では、Linuxにおけるジョブ管理とバックグラウンド実行について解説しました。

目的 推奨される方法
一時的なバックグラウンド実行 コマンド末尾に&
実行中のジョブをバックグラウンドへ Ctrl+Z → bg
セッション切断後も継続(単発) nohup または disown
セッション管理が必要 screen または tmux
複雑なマルチタスク tmux(推奨)

長時間実行タスクを効率的に管理することで、サーバー運用の生産性が大きく向上します。特にtmuxは、リモートサーバーでの作業において必須のツールと言えるでしょう。

参考リンク