はじめに
この実験では、Linux システム上でプロセスを管理および監視するための不可欠なスキルを習得します。フォアグラウンド(最前面)とバックグラウンド(背面)の両方で実行されているプロセスを操作する方法を学び、コマンドライン環境とシステムリソースをより高度に制御できるようにします。この実習経験は、システム管理者から開発者に至るまで、Linux を扱うすべての人にとって基礎となる重要なものです。
まず、& 演算子を使用してバックグラウンドジョブを開始し、jobs でその状態を確認することから始めます。次に、ps を使用して実行中のプロセスを詳細に調査し、top でリアルタイムのシステムアクティビティを監視します。また、fg、bg、Ctrl-Z を使用したジョブ制御の実践も行います。最後に、renice によるプロセスの優先度調整と kill コマンドによるプロセスの終了方法を学び、プロセス管理のライフサイクル全体を網羅します。
& と jobs を使用したバックグラウンドプロセスの開始と表示
このステップでは、コマンドをバックグラウンドで実行する方法と、バックグラウンドジョブの状態を確認する方法を学びます。Linux シェルでは、通常コマンドを実行すると、その完了を待ってから次のプロンプトが表示されます。これを フォアグラウンド での実行と呼びます。しかし、実行に時間がかかるタスクの場合は、ターミナルで他のコマンドを引き続き入力できるように、バックグラウンド で実行させたいことがあります。
コマンドをバックグラウンドで実行するには、コマンドラインの末尾にアンパサンド(&)を追加するだけです。指定した時間だけ一時停止するシンプルなユーティリティである sleep コマンドを使って試してみましょう。
以下のコマンドを実行して、sleep を 300 秒間バックグラウンドで実行します。これにより、次のステップでこのプロセスを操作できるようになります。
sleep 300 &
Enter キーを押すと、以下のような出力が表示され、すぐにコマンドプロンプトが戻ってきます。これにより、新しいコマンドを入力できる状態になります。
[1] 12345
シェルは sleep 300 コマンドをバックグラウンドジョブとして開始しました。この出力には 2 つの重要な情報が含まれています。
[1]: これは ジョブ ID です。シェルは各バックグラウンドプロセスに固有のジョブ ID を割り当てます。12345: これは プロセス ID (PID) です。オペレーティングシステムは、実行中のすべてのプロセスに固有の PID を割り当てます。実際の PID は例とは異なります。
プロセスがバックグラウンドで実行されているので、その状態を確認してみましょう。現在のシェルセッションのバックグラウンドで実行されているすべてのジョブをリスト表示する jobs コマンドを使用します。
ターミナルで jobs コマンドを実行してください。
jobs
出力には、先ほど開始した sleep コマンド、そのジョブ ID、および現在のステータスが表示されます。
[1]+ Running sleep 300 &
これで、プロセスをバックグラウンドで開始し、その状態を確認する方法を習得しました。これは Linux システムで長時間実行されるタスクを管理するための基本的なスキルです。次のステップでは、このバックグラウンドジョブを操作する方法を詳しく見ていきます。
ps による実行中のプロセスの調査
前のステップでは、jobs コマンドを使用して現在のシェルのバックグラウンドプロセスを確認しました。しかし、jobs は現在のセッションに限定されています。システムで実行されているすべてのプロセスをより広く把握するには、より強力なツールである ps (process status) が必要です。ps コマンドは、実行した瞬間のプロセスのスナップショットを提供します。
まずは、オプションなしで ps を実行してみましょう。このコマンドは、現在のユーザーが所有し、現在のターミナルに関連付けられているプロセスのスナップショットを表示します。
ps
出力は最小限で、おそらく使用中のシェル(zsh)と、今実行した ps コマンドだけが表示されます。PID はシステムによって異なります。
PID TTY TIME CMD
23882 pts/0 00:00:00 zsh
23953 pts/0 00:00:00 ps
自分のターミナルだけでなく、システムで実行されているすべてのプロセスを表示するには、オプション付きの ps を使用します。非常によく使われる便利な組み合わせは ps aux です。
a: すべてのユーザーのプロセスを表示します。u: ユーザー指向のフォーマットで表示します(ユーザー名、CPU 使用率、メモリ使用率など)。x: ターミナルに関連付けられていないプロセスも含めます。
特定のプロセスを探している場合、膨大なリストはあまり役に立ちません。そこで、ps と grep コマンドを組み合わせて出力をフィルタリングします。前のステップで開始した sleep プロセスを探してみましょう。
ps aux | grep sleep
このコマンドは ps aux の出力をフィルタリングし、"sleep" という単語を含む行だけを表示します。
labex 23885 0.0 0.0 7264 868 pts/0 S 11:50 0:00 sleep 300
labex 23962 0.0 0.0 10788 2240 pts/0 S+ 11:52 0:00 grep --color=auto sleep
出力にはおそらく 2 行表示されます。1 つは sleep 300 プロセスです。もう 1 つは grep sleep コマンド自体で、ps がプロセスリストを取得した瞬間に実行されていたものです。sleep 300 の PID(この例では 23885)が、最初にバックグラウンドで実行したときに表示されたものと一致していることに注目してください。
プロセスを表示するためのもう 1 つの一般的な形式は ps -ef です。
-e: システム上のすべてのプロセスを選択します。-f: 親プロセス ID (PPID) などの有用な情報を含む「フル」フォーマットで表示します。
これも grep を使って sleep プロセスを探してみましょう。
ps -ef | grep sleep
出力形式は異なりますが、同様の情報が得られます。この表示は、PID と PPID カラムを通じてプロセスの親子関係(階層)を確認するのに特に役立ちます。
UID PID PPID C STIME TTY TIME CMD
labex 23885 23882 0 11:50 pts/0 00:00:00 sleep 300
labex 23964 23882 0 11:53 pts/0 00:00:00 grep --color=auto sleep
これで、ps を使用してシステムプロセスのスナップショットを取得する方法がわかりました。grep などのツールと組み合わせることで、特定のプロセスを素早く見つけて調査することができます。
top によるシステムリソースの監視
このステップでは、リアルタイムのシステム監視のための強力なツールである top の使い方を学びます。ps がプロセスの静的なスナップショットを提供するのに対し、top はシステムアクティビティを動的に更新し続けて表示するため、リソースを大量に消費しているプロセスを即座に特定するのに非常に役立ちます。
開始するには、ターミナルで top と入力して Enter キーを押します。
top
ターミナルウィンドウ全体が top のインターフェースに切り替わります。データは数秒ごとに更新され、以下のように表示されます。
top - 12:05:15 up 15 min, 1 user, load average: 0.00, 0.01, 0.00
Tasks: 115 total, 1 running, 114 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1987.2 total, 985.4 free, 501.8 used, 500.0 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 1325.4 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 167900 12936 8488 S 0.0 0.6 0:01.15 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
...
top のインターフェースは主に 2 つの部分に分かれています。
- 上部の サマリーエリア には、稼働時間、タスク数、CPU 負荷 (
%Cpu(s))、メモリ使用量 (MiB Mem) などのシステム全体の統計が表示されます。 - 下部の プロセスリスト には個々のプロセスが表示され、デフォルトでは CPU 使用率 (
%CPU) の高い順に並んでいます。
top コマンドは対話型です。特定のキーを押すことで動作を変更できます。いくつか試してみましょう。
- メモリ使用量でソート:
M(大文字の M) を押します。リストが%MEMカラムに基づいて並べ替えられ、メモリを最も多く消費しているプロセスが一番上に表示されます。 - CPU 使用率でソート:
P(大文字の P) を押します。リストがデフォルトの%CPUカラム順に戻ります。 sleepプロセスを探す: 先ほど開始したsleepプロセスを探してみてください。CPU を使用していないため、リストのかなり下の方にあるはずです。下矢印キーと上矢印キーを使用してプロセスリストをスクロールできます。
確認が終わったら、いつでも top を終了できます。
topを終了:qを押すとtopインターフェースを終了し、コマンドプロンプトに戻ります。
これで、top を使用してシステムのプロセスとリソース使用状況をリアルタイムで確認する方法を学びました。これは、パフォーマンスの問題をトラブルシューティングするシステム管理者にとって必須のコマンドです。
fg、bg、Ctrl-Z によるジョブ制御の管理
このステップでは、実行中のジョブの状態を管理する方法を学びます。すでにバックグラウンドでジョブを開始する方法は知っていますが、フォアグラウンドで時間のかかるコマンドを開始した後に、ターミナルを別の操作に使いたいことに気づいた場合はどうすればよいでしょうか。ジョブ制御を使用すると、プロセスをフォアグラウンドとバックグラウンドの間で移動させたり、一時停止(停止)および再開させたりすることができます。
先ほど開始した sleep 300 プロセスを操作してみましょう。まず、jobs コマンドで状態を確認し、まだ実行中であることを確かめます。
jobs
バックグラウンドで sleep ジョブが実行されているのが見えるはずです。
[1] + running sleep 300
次に、このジョブをフォアグラウンドに持ってきます。これには fg (foreground) コマンドを使用し、その後に % を付けたジョブ ID を指定します。今回のジョブ ID は 1 なので、コマンドは以下のようになります。
fg %1
シェルにコマンド名と追加のジョブ情報が表示され、コマンドプロンプトが消えます。ターミナルは sleep 300 コマンドによって「占有」され、完了を待っている状態になります。
[1] + 394 running sleep 300
プロセスを終了させずにターミナルを取り戻すには、プロセスを 停止 させます。キーの組み合わせ Ctrl-Z (Ctrl キーを押しながら Z を押す) を入力してください。
この操作により、プロセスに特別なシグナル (SIGTSTP) が送信され、実行が一時停止されます。プロセスは終了したわけではなく、単に中断された状態です。確認メッセージが表示され、プロンプトが戻ります。
[1] + 394 suspended sleep 300
ここで、もう一度ジョブの状態を確認します。
jobs
出力には、ジョブのステータスが "suspended"(中断)として表示されます。
[1] + suspended sleep 300
停止したジョブは再開できます。fg でフォアグラウンドで再開することも、bg でバックグラウンドで再開することもできます。ここでは bg コマンドを使用してバックグラウンドで再開させてみましょう。
bg %1
シェルは、ジョブが再びバックグラウンドで実行(続行)されたことを通知します。
[1] + 394 continued sleep 300
最後にもう一度 jobs でステータスを確認し、"Running" に戻っていることを確認してください。これで、プロセスをバックグラウンドからフォアグラウンドに移動し、停止させ、再びバックグラウンドで再開させることに成功しました。
renice によるプロセスの優先度調整
このステップでは、実行中のプロセスのスケジューリング優先度に影響を与える方法を学びます。Linux では、プロセスの「ナイス値 (niceness)」によって、他のプロセスと比較してどれだけの CPU 時間が割り当てられるかが決まります。ナイス値の範囲は -20(最高優先度)から +19(最低優先度)までです。デフォルトでは、ほとんどのプロセスはナイス値 0 で開始されます。ナイス値が高いほど、そのプロセスは他のプロセスに対して「ナイス(親切)」であり、CPU 時間を譲りやすくなります。
操作してきた sleep プロセスの優先度を調整してみましょう。そのためには、まずそのプロセス ID (PID) が必要です。ps と grep を使って再度確認します。
ps aux | grep sleep
sleep 300 に対応する行(grep コマンド自体の行ではありません)を探し、2 番目のカラムから PID をメモします。
labex 23885 0.0 0.0 7264 868 pts/0 S 11:50 0:00 sleep 300
labex 24101 0.0 0.0 10788 2240 pts/0 S+ 12:15 0:00 grep --color=auto sleep
この例では、PID は 23885 です。以降のコマンドでは、必ず自分の出力に表示された PID を使用してください。
次に、プロセスの現在のナイス値 (NI) を確認しましょう。-o オプション付きの ps コマンドを使用すると、表示するカラムをカスタマイズできます。
ps -o pid,ni,cmd -p <YOUR_PID>
<YOUR_PID> を実際の sleep プロセスの PID に置き換えてください。例:ps -o pid,ni,cmd -p 23885
PID NI CMD
23885 5 sleep 300
期待通り、デフォルトのナイス値 (NI) は 5 です。
では、renice コマンドを使用してこの値を変更してみましょう。ナイス値を 10 に増やして、プロセスの優先度を下げます。一般ユーザーは、自分が所有するプロセスのナイス値を増やす(優先度を下げる)ことだけが可能です。
renice -n 10 -p <YOUR_PID>
ここでも <YOUR_PID> を自分のプロセスの PID に置き換えます。コマンドを実行すると、古い優先度と新しい優先度が報告されます。
23885 (process ID) old priority 5, new priority 10
最後に、もう一度 ps コマンドを実行して、変更が反映されたことを確認します。
ps -o pid,ni,cmd -p <YOUR_PID>
出力に新しいナイス値が表示されるはずです。
PID NI CMD
23885 10 sleep 300
実行中のプロセスの優先度を変更することに成功しました。これは、長時間実行される重要度の低いバックグラウンドタスクが、より重要なフォアグラウンドの作業を妨げないようにするための有用なテクニックです。
kill によるプロセスの終了
最後のステップでは、プロセスを終了させる方法を学びます。プロセスの中には自動的に終了するものもありますが、不要になったプロセス、誤動作しているプロセス、あるいは今回の sleep コマンドのように一時的な目的で開始したプロセスを手動で停止させる必要があることがよくあります。そのための主なツールが kill コマンドです。
kill コマンドは、指定したプロセスにシグナルを送信します。デフォルトでは SIGTERM(終了)シグナルを送信します。これはプロセスに対して「終了してください」と丁寧に依頼するもので、プロセスが終了前にクリーンアップ処理(保存など)を行うことを可能にします。
プロセスを指定するには、プロセス ID (PID) を使うか、現在のシェルのバックグラウンドジョブであればジョブ ID を使います。ジョブ ID を使う方が便利な場合が多いです。
まず、sleep ジョブがまだ実行中であることを確認します。
jobs
sleep プロセスが表示されるはずです。
[1]+ Running sleep 300 &
次に、ジョブ ID (%1) を指定して kill コマンドを実行し、プロセスを終了させます。
kill %1
コマンドを実行した後、シェルはジョブが終了したことを示すメッセージをターミナルに表示します。このメッセージはすぐに表示されることもあれば、もう一度 Enter キーを押した後に表示されることもあります。
[1]+ Terminated sleep 300
プロセスが本当に消えたか確認しましょう。もう一度 jobs コマンドを実行します。
jobs
このシェルセッションにはアクティブなジョブがもう存在しないため、何も出力されないはずです。ps を使ってダブルチェックすることもできます。
ps aux | grep sleep
表示される可能性があるのは grep sleep コマンド自体の行だけです。元の sleep 300 プロセスはもう実行されていません。
プロセスが反応せず、デフォルトの SIGTERM シグナルで終了しない場合は、より強力な SIGKILL(シグナル番号 9)を送信できます。これはクリーンアップの機会を与えず、即座にプロセスを強制終了させます。コマンドは kill -9 %1 となります。これは最終手段として使用してください。
おめでとうございます!これで Linux における基本的なプロセス管理のライフサイクルを一通り実践しました。プロセスのバックグラウンド実行、ps や top による調査、ジョブ制御による管理、優先度の調整、そして最後にプロセスの終了までを習得しました。
まとめ
この実験では、Linux 環境でプロセスを管理および監視するための基本的なスキルを学びました。まず、& 演算子を使用してプロセスをバックグラウンドで実行し、jobs コマンドでその状態を確認しました。次に、ps を使用して実行中のすべてのプロセスを調査し、プロセス ID (PID) などの詳細を確認する方法や、top を使用してシステムリソースの使用状況やアクティブなプロセスをリアルタイムで監視する方法を学びました。
さらに、Ctrl-Z でフォアグラウンドプロセスを中断し、bg でバックグラウンドに移動させ、fg で再びフォアグラウンドに戻すというジョブ制御を実践しました。また、renice を使用してプロセスのスケジューリング優先度を調整する方法や、PID を指定して kill コマンドでプロセスを正常に終了させる方法も習得しました。



