はじめに

こんにちは!今回はjobsコマンドについて解説します。

jobsは現在のシェルで実行中のバックグラウンドジョブを表示するコマンドです。複数のプロセスを同時に実行する時に、どのジョブが動いているのか確認するのに使います。

シェルの組み込みコマンドなので、シェルスクリプトでもよく使われます。バックグラウンド処理を管理する時には欠かせませんね!


jobsコマンドとは

jobsは、シェルに組み込まれたコマンドで、現在のシェルセッションで実行中または停止中のバックグラウンドジョブを表示します。

Linuxでは、コマンドを「&」でバックグラウンド実行できます。そうすると、複数のプロセスが同時に動作しますが、どのプロセスがどのジョブなのか、どのジョブが完了したのか確認するのがjobsコマンドの役割です。

フォアグラウンドとバックグラウンドの切り替えに使うfgbgコマンドとセットで使うことが多いですね。


基本構文

1
jobs [オプション] [jobspec]
  • jobspec: ジョブID(オプション)
  • 指定しなければ、すべてのジョブを表示

主なオプション

オプション 説明
-l プロセスIDも一緒に表示
-n 状態が変わったジョブのみ表示
-p プロセスIDのみ表示
-r 実行中のジョブのみ表示
-s 停止中のジョブのみ表示
-x 指定したコマンドを実行し、ジョブのプロセスIDに置き換える

使用例

例1: 実行中のジョブを表示

1
2
3
sleep 100 &
sleep 200 &
jobs

実行結果:

1
2
[1]+  Running                 sleep 100 &
[2]-  Running                 sleep 200 &

バックグラウンドで実行中のジョブが表示されます。

例2: ジョブIDとプロセスIDを表示

1
jobs -l

実行結果:

1
2
[1]  12345 Running                 sleep 100 &
[2]  12346 Running                 sleep 200 &

-lオプションでプロセスID(PID)も表示します。

例3: 実行中のジョブのみ表示

1
jobs -r

実行結果:

1
2
[1]+  Running                 sleep 100 &
[2]-  Running                 sleep 200 &

完了したジョブは表示されません。

例4: 停止中のジョブのみ表示

1
jobs -s

実行結果:

1
[1]+  Stopped                 sleep 100

Ctrl+Zで停止させたジョブのみが表示されます。

例5: プロセスIDのみ表示

1
jobs -p

実行結果:

1
2
12345
12346

プロセスIDだけが表示されるので、他のコマンドと組み合わせやすいです。

例6: バックグラウンドジョブを再開

1
fg %1

実行結果:

1
sleep 100

ジョブID 1 をフォアグラウンドで再開します。

例7: 停止中のジョブをバックグラウンドで再開

1
bg %2

実行結果:

1
[2]+ sleep 200 &

停止中のジョブをバックグラウンドで再開します。

例8: 特定のジョブを表示

1
jobs %1

実行結果:

1
[1]+  Running                 sleep 100 &

ジョブID 1 の情報のみを表示します。

例9: すべてのジョブをkill

1
jobs -p | xargs kill

実行結果:

1
(コマンド成功時は何も表示されない)

実行中のすべてのジョブを一括で終了させます。

例10: 状態が変わったジョブのみ表示

1
jobs -n

実行結果:

1
[2]-  Done                    sleep 200 &

前回の実行時から状態が変わったジョブのみが表示されます。


Tips・注意点

ジョブIDとプロセスIDの違い

ジョブID([1]など)はシェル側で管理される番号で、プロセスID(PIDなど)はOSレベルで管理される番号です。別物です。

1
2
jobs -l    # ジョブID と プロセスID の両方表示
ps aux     # プロセスID のみ(OSレベル)

%記号の使い方

ジョブを指定する時は、%記号を使います:

1
2
3
fg %1          # ジョブID 1 をフォアグラウンドに
bg %2          # ジョブID 2 をバックグラウンドで再開
kill %1        # ジョブID 1 を終了

フォアグラウンドとバックグラウンドの切り替え

1
2
3
4
5
6
7
8
# 実行中のジョブを一時停止
Ctrl+Z

# 停止中のジョブをフォアグラウンドで再開
fg

# 停止中のジョブをバックグラウンドで再開
bg

ターミナル終了時の注意

ターミナルを閉じると、バックグラウンドジョブも終了してしまいます。長時間実行が必要な場合は、nohupを使ってください。


実践的な使い方

複数のバックアップを並列実行

1
2
3
4
tar czf backup1.tar.gz dir1/ &
tar czf backup2.tar.gz dir2/ &
tar czf backup3.tar.gz dir3/ &
jobs

複数のバックアップを同時に実行して、進行状況を確認します。

ファイルダウンロードを並列実行

1
2
3
4
wget https://example.com/file1.zip &
wget https://example.com/file2.zip &
wget https://example.com/file3.zip &
jobs -l

複数のファイルを同時にダウンロード。プロセスIDも確認できます。

停止中のプロセスをバックグラウンドで再開

1
2
3
4
5
6
7
8
# Ctrl+Z で停止させたプロセスを確認
jobs

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

# 再度確認
jobs

意図せず停止させたプロセスを再開できます。

すべてのバックグラウンドジョブの完了を待つ

1
2
3
4
5
long_running_task &
another_task &
jobs
wait    # すべてのバックグラウンドジョブの完了を待つ
echo "All jobs completed"

waitコマンドですべてのバックグラウンドジョブの完了を待ちます。


まとめ

jobsコマンドのポイント:

  • シェルの組み込みコマンド
  • バックグラウンドジョブの状態を表示
  • -l: プロセスIDも表示
  • -r: 実行中のジョブのみ
  • -s: 停止中のジョブのみ
  • -p: プロセスIDのみ表示
  • よく使う組み合わせ: fg %1, bg %2, jobs -l

バックグラウンド処理を管理する時に不可欠なコマンド。複数のタスクを同時実行する際は、jobsコマンドで進捗を確認しながら作業を進めましょう!