Linux ジョブ管理

LinuxBeginner

はじめに

この実験では、Linux のジョブ管理の基本を学びます。ジョブ管理は Linux ユーザーにとって不可欠なスキルで、複数のプロセスを同時に実行し、その実行を制御することができます。ジョブ管理を習得することで、コマンドをバックグラウンドで効率的に実行し、フォアグラウンドとバックグラウンドのタスクを切り替え、実行中のすべてのプロセスを管理することができます。

この実験を通じて、以下のことを学びます。

  • バックグラウンドでプロセスを起動する方法
  • 実行中のジョブを表示および管理する方法
  • バックグラウンドのジョブをフォアグラウンドに移動する方法
  • 実行中のジョブを一時停止し、後で再開する方法
  • 必要なくなったジョブを終了する方法

これらのスキルは、常に対話する必要のない長時間実行されるタスクを扱う際に特に有用で、プロセスがバックグラウンドで実行されている間に他のタスクに引き続き取り組むことができます。

バックグラウンドジョブの起動と管理

このステップでは、アンパサンド (&) 記号を使用してバックグラウンドでプロセスを起動する方法と、jobs コマンドを使用してそれを管理する方法を学びます。

バックグラウンドジョブとは何か?

Linux では、ジョブはシェルが管理するプロセスです。デフォルトでは、ターミナルでコマンドを実行すると、それはフォアグラウンドで実行されます。つまり、コマンドが完了するまでターミナルは占有されます。ただし、コマンドの末尾に & 記号を追加することで、それをバックグラウンドで実行し、ターミナルを他のタスクに解放することができます。

バックグラウンドプロセスの作成

バックグラウンドで継続的に実行される簡単なスクリプトを作成しましょう。これは、他の作業を続けながら実行したい長時間実行されるタスクをシミュレートします。

まず、まだそこにいない場合は、プロジェクトディレクトリに移動します。

cd ~/project

次に、nano テキストエディタを使用して background_task.sh という名前のスクリプトを作成します。

nano ~/project/background_task.sh

エディタ内に以下の内容を追加します。

#!/bin/bash
## A simple script that simulates a long-running task
count=0
while true; do
  count=$((count + 1))
  echo "Task running: iteration $count"
  sleep 5
done

このスクリプトは無限に実行され、5 秒ごとにメッセージを出力します。

Ctrl+O を押してから Enter を押してファイルを保存し、次に Ctrl+X を押して nano を終了します。

次に、スクリプトを実行可能にします。

chmod +x ~/project/background_task.sh

ここで、コマンドの末尾に & 記号を追加して、スクリプトをバックグラウンドで実行します。

~/project/background_task.sh &

以下のような出力が表示されるはずです。

[1] 1234

角括弧内の数字 [1] はジョブ番号で、その後の数字はプロセス ID (PID) です。これらの数字は、あなたのシステムでは異なる場合があります。

実行中のジョブの確認

現在実行中のすべてのバックグラウンドジョブを表示するには、jobs コマンドを使用します。

jobs

以下のような出力が表示されるはずです。

[1]  + running    ~/project/background_task.sh

これにより、スクリプトがバックグラウンドで実行されていることが確認されます。

ジョブの詳細情報(PID を含む)を取得するには、次のコマンドを使用します。

jobs -l

出力には、ジョブ番号、PID、およびステータスが表示されます。

[1]  + 1234 running    ~/project/background_task.sh

スクリプトがバックグラウンドで実行され続ける間、ターミナルは他のコマンドを実行するために自由に使用できます。スクリプトの出力は依然としてターミナルに送信されるため、定期的にメッセージが表示されます。

バックグラウンドジョブをフォアグラウンドに移動する

このステップでは、fg コマンドを使用してバックグラウンドジョブをフォアグラウンドに移動する方法を学びます。これは、現在バックグラウンドで実行されているプロセスと対話する必要がある場合に便利です。

フォアグラウンド化とは何か?

フォアグラウンド化とは、バックグラウンドジョブをフォアグラウンドに移動し、ターミナルでアクティブなプロセスにすることを指します。ジョブがフォアグラウンドにある場合、それはターミナルを制御します。つまり、直接それと対話できますが、それが完了するかバックグラウンドに戻されるまで他のコマンドを実行することはできません。

fg コマンドの使用

前のステップで background_task.sh スクリプトがまだ実行されていることを確認してください。これは次のコマンドで確認できます。

jobs

スクリプトが実行中のジョブとしてリストされているはずです。

ジョブをフォアグラウンドに移動するには、fg コマンドの後にパーセント記号付きのジョブ番号を指定します。

fg %1

バックグラウンドジョブが 1 つしかない場合は、単に次のコマンドを使用できます。

fg

コマンドを実行すると、スクリプトがフォアグラウンドに移動し、その出力がターミナルに直接表示されます。

Task running: iteration X
Task running: iteration X+1
...

コマンドプロンプトが消え、スクリプトがターミナルを制御するようになったことに気付くでしょう。スクリプトを終了するかバックグラウンドに戻すまで、他のコマンドを入力することはできません。

フォアグラウンドジョブの停止

フォアグラウンドジョブを停止してコマンドプロンプトに戻るには、Ctrl+C を押します。これにより、プロセスに割り込み信号が送信され、プロセスが終了します。

^C

ターミナルには、ジョブが終了したことを示すメッセージが表示され、コマンドプロンプトが再度表示されるはずです。

ジョブがもう実行されていないことを確認するには、次のコマンドを実行します。

jobs

出力がないはずで、これはバックグラウンドジョブが実行されていないことを示しています。

次のステップのために、スクリプトを再びバックグラウンドで起動しましょう。

~/project/background_task.sh &

ジョブが起動したことが確認され、次のような出力が表示されるはずです。

[1] 1345

ジョブ番号と PID は、あなたのシステムでは異なる場合があることを忘れないでください。

ジョブの一時停止と再開

このステップでは、実行中のフォアグラウンドジョブを一時停止し、フォアグラウンドまたはバックグラウンドで再開する方法を学びます。これは、プロセスを終了させずに一時的に中断する必要がある場合に便利です。

フォアグラウンドジョブの一時停止

まず、バックグラウンドジョブをフォアグラウンドに移動しましょう。

fg %1

これで、ターミナルにスクリプトの出力が表示されるはずです。このフォアグラウンドジョブを一時停止するには、Ctrl+Z を押します。

^Z

次のようなメッセージが表示されるはずです。

[1]  + suspended  ~/project/background_task.sh

これは、ジョブが一時停止されたことを示しています。ジョブはまだメモリにロードされていますが、実行は停止しており、基本的に「一時停止」状態になっています。

ジョブが一時停止されていることを確認するには、次のコマンドを実行します。

jobs

次のような出力が表示されるはずです。

[1]  + suspended  ~/project/background_task.sh

一時停止されたジョブをバックグラウンドで再開する

一時停止されたジョブは、フォアグラウンドまたはバックグラウンドで再開することができます。バックグラウンドで再開するには、bg コマンドの後にジョブ番号を指定します。

bg %1

ジョブがバックグラウンドで再開されたことを確認するメッセージが表示されるはずです。

[1]  + continued  ~/project/background_task.sh

ジョブが現在バックグラウンドで実行されていることを確認します。

jobs

出力には、ジョブのステータスが「suspended」から「running」に変更されたことが表示されるはずです。

[1]  + running    ~/project/background_task.sh

一時停止されたジョブをフォアグラウンドで再開する

再度ジョブを一時停止しましょう。まず、フォアグラウンドに移動します。

fg %1

次に、Ctrl+Z を押して一時停止します。

^Z

ここで、bg を使用してバックグラウンドで再開する代わりに、fg を使用してフォアグラウンドで再開します。

fg %1

ジョブは実行を再開し、ターミナルに再びその出力が表示されます。

Ctrl+C を押してジョブを停止しましょう。

^C

これにより、ジョブが終了し、コマンドプロンプトに戻ります。

ワークフローでのジョブ制御の使用

ジョブを一時停止、バックグラウンドで再開、フォアグラウンドで再開、および終了する機能は、プロセスを強力に制御することができます。このワークフローは、次のような場合に特に便利です。

  1. プロセスが実行中の間に他のことを確認する必要がある場合
  2. 一時的にシステムリソースを解放する必要がある場合
  3. 複数のターミナルウィンドウを開かずに複数のプロセスを対話的に実行したい場合

次のステップのために、バックグラウンドタスクを再度起動しましょう。

~/project/background_task.sh &

バックグラウンドジョブの終了

このステップでは、必要なくなったバックグラウンドジョブを終了するさまざまな方法を学びます。適切なジョブの終了は、システムリソースを解放し、システムパフォーマンスを維持するために重要です。

終了対象のジョブを特定する

まず、現在実行中のジョブを確認しましょう。

jobs

バックグラウンドタスクが実行中であることが表示されるはずです。

[1]  + running    ~/project/background_task.sh

プロセス ID (PID) を含むより詳細な情報が必要な場合は、次のコマンドを使用します。

jobs -l

これにより、次のような出力が表示されます。

[1]  + 1456 running    ~/project/background_task.sh

PID (ジョブ番号の後の数字) をメモしておきましょう。これはプロセスを終了するために使用できます。

方法 1: ジョブ番号を使用してジョブを終了する

バックグラウンドジョブを終了する最も簡単な方法は、kill コマンドにジョブ番号を指定することです。

kill %1

ジョブが終了したかどうかを確認します。

jobs

次のような表示がされるかもしれません。

[1]  + terminated  ~/project/background_task.sh

ジョブがまだ実行中の場合 (一部のプロセスはより強力な終了信号を必要とすることがあります)、次のコマンドを使用できます。

kill -9 %1

-9 フラグは SIGKILL 信号を送信し、プロセスを強制的に終了させ、クリーンアップを行わせません。

方法 2: PID を使用してジョブを終了する

スクリプトの別のインスタンスをバックグラウンドで起動しましょう。

~/project/background_task.sh &

ジョブ番号と PID が表示されるはずです。

[1] 1567

このジョブを PID を使用して終了するには、次のコマンドを使用します。

kill 1567

1567 を実際のジョブの PID に置き換えてください。

ジョブが終了したことを確認します。

jobs

方法 3: killall でプロセス名を使用する

スクリプトのさらに別のインスタンスを起動しましょう。

~/project/background_task.sh &

同じプロセスの複数のインスタンスが実行中の場合、killall コマンドを使用してすべてを一度に終了できます。

killall background_task.sh

このコマンドは、background_task.sh という名前のすべてのプロセスを終了します。

実行中のジョブがないことを確認します。

jobs

出力がないはずで、これはすべてのバックグラウンドジョブが終了したことを示しています。

終了信号の理解

kill コマンドを使用するとき、プロセスに信号を送信しています。デフォルトでは、kill は SIGTERM 信号 (信号 15) を送信し、プロセスに正常に終了するように要求します。プロセスが SIGTERM に応答しない場合は、SIGKILL (信号 9) を使用して強制終了できます。

kill -TERM %1 ## kill %1 と同じ
kill -KILL %1 ## kill -9 %1 と同じ

他の有用な信号には以下のものがあります。

  • SIGHUP (信号 1): 構成ファイルを再読み込みするためによく使用されます
  • SIGINT (信号 2): Ctrl+C を押すのと同じ
  • SIGSTOP (信号 19): プロセスを一時停止します (捕捉または無視できません)
  • SIGCONT (信号 18): 停止したプロセスを再開します

最後のデモンストレーションとして、バックグラウンドタスクを再度起動してから終了しましょう。

~/project/background_task.sh &
jobs
kill %1
jobs

この一連の操作で、ジョブを起動し、実行中であることを確認し、終了し、そしてもう実行されていないことを確認します。

まとめ

この実験では、Linux 環境でジョブを管理するための重要なスキルを学びました。

  1. バックグラウンドジョブの起動& 記号を使用してプロセスをバックグラウンドで実行する方法を学びました。これにより、長時間実行されるタスクが実行中でもターミナルで作業を続けることができます。

  2. ジョブの状態確認jobs コマンドを使用して、実行中のジョブの状態、ジョブ番号、プロセス ID などの情報を表示する方法を学びました。

  3. バックグラウンドジョブをフォアグラウンドに移動fg コマンドを使用してバックグラウンドジョブをフォアグラウンドに移動する練習を行いました。これにより、直接ジョブと対話することができます。

  4. ジョブの一時停止と再開Ctrl+Z で実行中のフォアグラウンドジョブを一時停止し、fg でフォアグラウンド、bg でバックグラウンドで再開する方法を学びました。

  5. ジョブの終了:必要なくなったジョブを終了するさまざまな方法を調べました。これには、ジョブ番号や PID を指定して kill コマンドを使用する方法や、killall を使用して名前で複数のプロセスを終了する方法が含まれます。

これらのジョブ管理スキルは、長時間実行されるプロセスを扱う場合やターミナル環境でマルチタスクを行う場合など、すべての Linux ユーザーにとって価値があります。プロセスの実行方法とタイミングを制御することで、システムリソースをより効率的に利用し、ワークフローを合理化することができます。

kill コマンドには、正常な終了から強制終了まで、さまざまな信号を使用してプロセスの動作を制御できることを忘れないでください。これにより、システムのプロセスを細かく制御することができます。