メインコンテンツへスキップ
中級11分で読める

ジョブコントロール完全理解

Linuxのジョブコントロールを完全マスター。フォアグラウンド・バックグラウンドジョブの操作、fg、bg、jobs、nohup、disownコマンドの使い分けまで詳しく解説します。

システム編ジョブコントロールプロセス管理バックグラウンドシステム

🎯 この記事で学べること

  • 1
    ジョブとプロセスの違いを理解できます
  • 2
    フォアグラウンド・バックグラウンドの概念と使い分けがわかります
  • 3
    Ctrl+Z、fg、bg、jobsコマンドを使いこなせるようになります
  • 4
    nohupとdisownの違いと使いどころを理解できます
  • 5
    複数のタスクを効率的に並行処理する方法が身につきます

読了時間: 約11

はじめに

こんにちは!今日は「ジョブコントロール」について学びましょう。

「大きなファイルをダウンロード中だけど、他の作業もしたい...」「複数のプログラムを同時に実行したい...」そんな経験はありませんか?

ジョブコントロールは、1つのターミナルで複数の作業を同時に管理できる便利な機能です。まるで料理をしながら洗い物もして、同時に音楽も聴く...そんな「ながら作業」をターミナルでも実現できるんです!

ジョブとプロセスって何が違うの?

まず、似ているようで違う「ジョブ」と「プロセス」の違いを理解しましょう。

  • プロセス: 実行中のプログラム1つ1つ
  • ジョブ: シェルが管理する作業の単位(複数のプロセスをまとめることも)

例えば:

$ ls | grep txt | wc -l

これは3つのプロセス(ls、grep、wc)が1つのジョブとして管理されます。

🎮 理解度チェック

パイプでつながった複数のコマンド(ls | grep | wc)は、何として扱われますか?

フォアグラウンドとバックグラウンド

ジョブには2つの実行モードがあります:

フォアグラウンド(前面)

  • ターミナルを占有する
  • キーボード入力を受け付ける
  • 通常のコマンド実行はこれ

バックグラウンド(背面)

  • ターミナルを占有しない
  • 裏で静かに実行される
  • 他の作業と並行できる

イメージとしては:

  • フォアグラウンド: テレビを見ているとき(画面を占有)
  • バックグラウンド: 音楽を聴きながら作業(裏で再生)

バックグラウンドで実行する方法

& を使った起動

コマンドの最後に & を付けるだけ!

# 時間のかかる処理をバックグラウンドで
$ ./backup.sh &
[1] 12345

# 説明:
# [1] - ジョブ番号
# 12345 - プロセスID(PID)

複数のジョブを同時に

$ download_file1.sh & download_file2.sh & process_data.sh &
[1] 12345
[2] 12346  
[3] 12347

3つのダウンロードが同時に進行します!

実行中のジョブを一時停止・再開する

Ctrl+Z で一時停止

実行中のプログラムを一時停止できます:

$ vim large_file.txt
# 編集中に Ctrl+Z を押す
[1]+  Stopped                 vim large_file.txt

「ちょっと待って!」という感じで、作業を中断できます。

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

停止したジョブを裏で再開:

# 最後に停止したジョブを再開
$ bg
[1]+ vim large_file.txt &

# ジョブ番号を指定
$ bg %2

fg でフォアグラウンド再開

停止したジョブを前面に戻す:

# 最後のジョブを前面に
$ fg

# ジョブ番号を指定
$ fg %1

# 名前の一部で指定(便利!)
$ fg %vim

vimを編集中に急な調査が必要になったら、Ctrl+Z で一時停止 → 調査 → fg で編集に戻る、という使い方ができます!

jobs コマンドでジョブを管理

現在のジョブを確認

# シンプルな表示
$ jobs
[1]-  Running                 download.sh &
[2]+  Stopped                 vim config.txt

# + は最新のジョブ
# - は最新から2番目

詳細情報を表示

# プロセスIDも表示
$ jobs -l
[1]- 12345 Running                 download.sh &
[2]+ 12346 Stopped                 vim config.txt

# プロセスIDだけ表示
$ jobs -p
12345
12346

ジョブの状態

| 状態 | 意味 | |------|------| | Running | 実行中 | | Stopped | 一時停止中(Ctrl+Z) | | Done | 完了 | | Terminated | 強制終了された |

🎮 理解度チェック

実行中のプログラムを一時停止するショートカットキーは?

ジョブ指定の便利な記法

%1, %2, %3...  # ジョブ番号で指定
%%  または %+   # 最後のジョブ
%-              # 最後から2番目
%vim            # コマンド名の一部で指定
%?keyword?      # キーワードを含むジョブ

使用例:

$ fg %vim      # vimを前面に
$ kill %1      # ジョブ1を終了
$ bg %-        # 最後から2番目を背面に

ログアウト後も実行を続ける

nohup コマンド

ログアウトしても処理を継続:

# 基本的な使い方
$ nohup long_process.sh &
nohup: ignoring input and appending output to 'nohup.out'

# 出力先を指定
$ nohup backup.sh > backup.log 2>&1 &

# ログを確認
$ tail -f nohup.out

nohup は「No Hang UP」の略で、「電話を切っても大丈夫」という意味です。

disown コマンド

既に実行中のジョブをシェルから切り離す:

# ジョブを起動
$ long_process &
[1] 12345

# シェルの管理から外す
$ disown %1

# すべてのジョブを外す
$ disown -a

# 実行中のジョブだけ外す
$ disown -r

nohup vs disown

| 特徴 | nohup | disown | |------|-------|---------| | いつ使う | 起動時 | 実行中 | | 出力 | nohup.out に自動保存 | 手動でリダイレクト | | 使いやすさ | 簡単 | 柔軟 |

使い分け:

  • nohup: 最初からログアウト予定がある場合
  • disown: 実行してから「あ、ログアウトしたい」と思った場合

実践的な使用例

複数ファイルの並列処理

#!/bin/bash
# 4つまで同時実行する例

process_file() {
    echo "処理開始: $1"
    # 重い処理(圧縮など)
    gzip -k "$1"
    echo "処理完了: $1"
}

for file in *.log; do
    # バックグラウンドで実行
    process_file "$file" &
    
    # 同時実行数を制限
    while [ $(jobs -r | wc -l) -ge 4 ]; do
        sleep 0.5
    done
done

# すべて完了を待つ
wait
echo "全ファイルの処理が完了!"

長時間処理の管理

# データベースのバックアップ(時間がかかる)
$ nohup mysqldump -u root mydb > backup_$(date +%Y%m%d).sql 2>&1 &
[1] 12345

# 進捗を確認
$ tail -f nohup.out

# 必要なら優先度を下げる
$ renice +10 -p 12345

インタラクティブな作業の中断

# 設定ファイルを編集中
$ vim /etc/nginx/nginx.conf
# Ctrl+Z で一時停止

# エラーログを確認
$ tail -f /var/log/nginx/error.log
# 問題を確認

# 編集に戻る
$ fg

🎮 理解度チェック

既に実行中のジョブをログアウト後も継続させたい場合、使うコマンドは?

トラブルシューティング

よくある問題と解決法

  1. 出力が画面に混ざって見づらい

    # リダイレクトで解決
    $ noisy_command > output.log 2>&1 &
    
  2. Ctrl+Z が効かない

    # 別ターミナルから停止
    $ kill -STOP <PID>
    
  3. ジョブが見つからない

    # 現在のシェルのジョブのみ表示される
    $ jobs
    
    # 全プロセスから探す
    $ ps aux | grep process_name
    

ベストプラクティス

1. わかりやすい出力管理

# タイムスタンプ付きログファイル
$ command > log_$(date +%Y%m%d_%H%M%S).txt 2>&1 &

2. リソースに優しく

# CPU優先度を下げる
$ nice -n 10 heavy_process &

# I/O優先度も下げる
$ ionice -c 3 backup_script.sh &

3. 進捗の可視化

# 進捗表示付きコマンド
$ rsync -avP source/ destination/ &

screen/tmux との使い分け

ジョブコントロールは手軽ですが、より高度な管理には screen や tmux が便利:

| 用途 | ジョブコントロール | screen/tmux | |------|-------------------|-------------| | 短時間の並列処理 | ◎ | △ | | 長期間の作業 | △ | ◎ | | 複数画面での作業 | × | ◎ | | 学習コスト | 低 | 高 |

使い分けの目安:

  • 数時間以内の作業 → ジョブコントロール
  • 数日かかる作業 → screen/tmux
  • 複雑な開発作業 → tmux

📝 まとめ

今日はジョブコントロールについて学びました!

  • ジョブは複数のプロセスをまとめた作業単位
  • & でバックグラウンド実行、Ctrl+Z で一時停止
  • fg で前面に、bg で背面に移動
  • jobs で管理、nohupdisown でログアウト対応
  • 複数の作業を効率的に並行処理できる

ジョブコントロールを使いこなせば、1つのターミナルで複数の作業を効率的に進められます。まずは & での バックグラウンド実行から始めて、徐々に高度な機能を使っていきましょう!

次はtmuxで画面分割を学んで、さらに高度なターミナル管理に挑戦してみませんか?

今日の練習: まず sleep 30 & でバックグラウンドジョブを作り、jobs で確認してみましょう。次に、実行中のコマンドを Ctrl+Z で停止して、fgbg で操作する練習をしてみてください!