このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:ジョブの状態遷移

ジョブの状態遷移

 Linuxシステムでは、複数のプログラムを同時に実行・管理するためにジョブ制御が重要な役割を果たします。ジョブは実行中のコマンドやプログラムを指し、その状態はユーザーの操作によって動的に変化します。ここでは、ジョブの状態遷移について詳しく解説し、効率的な作業を実現するための方法を紹介します。

ジョブの状態と遷移

ジョブは主に以下の状態を持ちます。

  1. フォアグラウンド(Foreground):ジョブがユーザーのシェル上で直接実行されている状態。ユーザーの入力を受け付け、出力も即座に表示されます。
  2. バックグラウンド(Background):ジョブがシェルの背後で実行されている状態。ユーザーの入力を必要とせず、他のコマンドを同時に実行できます。
  3. 停止(Stopped):ジョブが一時停止されている状態。ユーザーの指示によって再開されるまで待機します。
  4. 終了(Terminated):ジョブが完了または終了した状態。

ジョブの状態遷移図

以下は、ジョブの状態遷移を示す図です。

ジョブの状態遷移に関するコマンド操作とその解説をまとめます。

コマンド解説
$ コマンドコマンドを実行すると、フォアグラウンドでプロセスが動作します。
Ctrl + Zフォアグラウンドで実行中のジョブを一時停止(停止状態)にします。
$ fg %ジョブ番号停止中のジョブをフォアグラウンドに戻して再開します。
$ bg %ジョブ番号停止中のジョブをバックグラウンドで再開します。
$ コマンド &コマンドをバックグラウンドで実行します。
$ jobs現在のジョブの一覧とその状態を表示します。
$ jobs -l現在のジョブの一覧をプロセスID付きで表示します。
Ctrl + Cフォアグラウンドで実行中のジョブを終了します。
$ kill PID or $ kill %ジョブ番号指定したプロセスIDまたはジョブ番号のジョブを終了します。
$ kill -19 PID指定したプロセスを停止(停止信号を送信)します。
ジョブの状態遷移図
  • フォアグラウンドジョブ: 通常、シェルでコマンドを実行するとフォアグラウンドで実行されます。フォアグラウンドジョブはユーザーが操作中のプロセスで、Ctrl + Cを使って終了できます。Ctrl + Zで一時停止が可能です。
  • 停止状態: ジョブを一時停止した後、jobsコマンドで確認できます。fgコマンドでフォアグラウンドに戻すことができ、bgコマンドでバックグラウンドに移動させて再開できます。
  • バックグラウンドジョブ&を使ってコマンドを実行するとバックグラウンドで動作します。バックグラウンドで実行されるジョブは他のコマンドを並行して実行する際に便利です。
  • 終了: ジョブやプロセスを終了する場合、killコマンドでPIDやジョブ番号を指定して終了できます。

 このコマンド群を利用することで、複数のジョブを効率的に管理し、作業の並行実行や停止、再開が可能となります。ジョブ番号やPIDを用いて柔軟にジョブを制御することで、システム操作の効率が向上します。

ジョブの状態遷移をさせる操作例

例1:ジョブを停止からバックグラウンド実行に遷移

1.長時間実行するコマンドを開始

user01@ubuntu:~$ sleep 10000

2.Ctrl + Zで一時停止

^Z
[1]+  停止                  sleep 10000
user01@ubuntu:~$ 

3.ジョブの状態を確認

user01@ubuntu:~$ jobs
[1]+  停止                  sleep 10000

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

user01@ubuntu:~$ bg %1
[1]+ sleep 10000 &

5.ジョブの状態を再度確認

user01@ubuntu:~$ jobs
[1]+  実行中               sleep 10000 &
  • ジョブはバックグラウンドで実行中に遷移しました。

例2:ジョブをバックグラウンドからフォアグラウンドに遷移

1.バックグラウンドでジョブを開始

user01@ubuntu:~$ tail -f /var/log/syslog &
[2] 4785
2024-10-25T01:24:45.496752+09:00 ubuntu dbus-daemon[2925]: [session uid=1000 pid=2925]
 Activating via systemd: service name='org.gnome.Terminal' unit='gnome-terminal-server
.service' requested by ':1.120' (uid=1000 pid=4747 comm="/usr/bin/gnome-terminal.real"
 label="unconfined")
...(省略)...

2.ジョブの状態を確認

user01@ubuntu:~$ jobs
[1]-  実行中               sleep 10000 &
[2]+  実行中               tail -f /var/log/syslog &

3.fgコマンドでフォアグラウンドに再開

user01@ubuntu:~$ fg %2
tail -f /var/log/syslog
2024-10-25T01:35:01.110537+09:00 ubuntu CRON[4792]: (root) CMD (command -v debian-sa1 > 
/dev/null && debian-sa1 1 1)
...(省略)...
  • ジョブがフォアグラウンドで実行され、ログがリアルタイムで表示されます。

注意:Linuxで動作させているサービスが少ない場合は、ログはあまり出力されません。

4.Ctrl + Zで一時停止

^Z
[2]+  停止                  tail -f /var/log/syslog
user01@ubuntu:~$ 

例3:ジョブを停止状態からフォアグラウンドに遷移

1.フォアグラウンドでエディタを起動し、Ctrl + tでモードを切り替え、 Ctrl + Zで一時停止

user01@ubuntu:~$ nano file.txt

"fg" とタイプすることで nano を再開できます。

[3]+  停止                  nano file.txt
user01@ubuntu:~$

2.ジョブの状態を確認

user01@ubuntu:~$ jobs
[1]   実行中               sleep 10000 &
[2]-  停止                  tail -f /var/log/syslog
[3]+  停止                  nano file.txt

3.fgコマンドでエディタを再開

user01@ubuntu:~$ fg %3
  • エディタがフォアグラウンドで再開され、編集を続けることができます。

4.nanoエディタを停止する。Ctrl + tでモードを切り替え、 Ctrl + Zで一時停止

user01@ubuntu:~$ nano file.txt

"fg" とタイプすることで nano を再開できます。

[3]+  停止                  nano file.txt
user01@ubuntu:~$

例4:ジョブの終了

1.ジョブの状態を確認

user01@ubuntu:~$ jobs
[1]   実行中               sleep 10000 &
[2]-  停止                  tail -f /var/log/syslog
[3]+  停止                  nano file.txt

2.ジョブ終了させる

user01@ubuntu:~$ kill %3

[3]+  停止                  nano file.txt
user01@ubuntu:~$ kill %2

[2]-  停止                  tail -f /var/log/syslog

[3]+  停止                  nano file.txt
user01@ubuntu:~$ kill %1
[2]-  Terminated              tail -f /var/log/syslog

まとめ

  • ジョブの状態は、フォアグラウンド、バックグラウンド、停止、終了の4つがあり、ユーザー操作によって遷移します。
  • 状態遷移は、以下の操作で行われます。
    Ctrl + Z:フォアグラウンドから停止へ
    bg:停止からバックグラウンドへ
    fg:停止またはバックグラウンドからフォアグラウンドへ
    &:コマンドをバックグラウンドで開始
  • ジョブ制御コマンドを活用することで、複数の作業を効率的に管理できます。
  • 実践的な操作例を通じて、ジョブの状態遷移を理解し、日常の業務に役立てましょう。

 ジョブの状態遷移を理解することで、Linux環境での作業効率が大幅に向上します。ジョブ制御をマスターして、快適なシェル操作を実現してください。