🎯 この記事で学べること
- 1ジョブとプロセスの違いを理解できます
- 2フォアグラウンド・バックグラウンドの概念と使い分けがわかります
- 3Ctrl+Z、fg、bg、jobsコマンドを使いこなせるようになります
- 4nohupとdisownの違いと使いどころを理解できます
- 5複数のタスクを効率的に並行処理する方法が身につきます
読了時間: 約11分
はじめに
こんにちは!今日は「ジョブコントロール」について学びましょう。
「大きなファイルをダウンロード中だけど、他の作業もしたい...」「複数のプログラムを同時に実行したい...」そんな経験はありませんか?
ジョブコントロールは、1つのターミナルで複数の作業を同時に管理できる便利な機能です。まるで料理をしながら洗い物もして、同時に音楽も聴く...そんな「ながら作業」をターミナルでも実現できるんです!
ジョブとプロセスって何が違うの?
まず、似ているようで違う「ジョブ」と「プロセス」の違いを理解しましょう。
- プロセス: 実行中のプログラム1つ1つ
- ジョブ: シェルが管理する作業の単位(複数のプロセスをまとめることも)
例えば:
$ ls | grep txt | wc -l
これは3つのプロセス(ls、grep、wc)が1つのジョブとして管理されます。
🎮 理解度チェック
フォアグラウンドとバックグラウンド
ジョブには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
🎮 理解度チェック
トラブルシューティング
よくある問題と解決法
-
出力が画面に混ざって見づらい
# リダイレクトで解決 $ noisy_command > output.log 2>&1 &
-
Ctrl+Z が効かない
# 別ターミナルから停止 $ kill -STOP <PID>
-
ジョブが見つからない
# 現在のシェルのジョブのみ表示される $ 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
で管理、nohup
やdisown
でログアウト対応- 複数の作業を効率的に並行処理できる
ジョブコントロールを使いこなせば、1つのターミナルで複数の作業を効率的に進められます。まずは & での バックグラウンド実行から始めて、徐々に高度な機能を使っていきましょう!
次はtmuxで画面分割を学んで、さらに高度なターミナル管理に挑戦してみませんか?
今日の練習: まず sleep 30 &
でバックグラウンドジョブを作り、jobs
で確認してみましょう。次に、実行中のコマンドを Ctrl+Z で停止して、fg
や bg
で操作する練習をしてみてください!