はじめに
私たちの多くがコンピュータを使用するとき、さまざまなアプリケーションを実行しています。これらのアプリケーションは、サーバーまたはオペレーティングシステムと呼ばれるプログラムによって実行されます。異なる方法で動作するさまざまな種類のサーバーがあります。そのうちの1つがLinuxです。Linuxはアプリケーションをプロセスの形式で実行します。
Linuxでは、各アプリケーションを「プロセス」と呼びます。サーバーは、プロセスのライフサイクルの低レベルな側面を管理することができます。ユーザーとして、より高レベルな側面を操作するためにサーバーと対話する必要がある場合があります。さまざまなツールを使用して、OSと通信し、管理することができます。サーバーのさまざまな側面や機能を変更するために使用できるコマンドは数多くあります。以下は、簡単に実行できるUbuntu上でLinuxベースのサーバーを簡単にセットアップする方法に関するチュートリアルです。さらに、LAMPスタック(Linux、Apache、MySQL、PHP)をインストールする方法.
このガイドでは、Linuxでプロセスを管理するためにps、kill、およびniceを使用する方法に焦点を当てています。
Linuxで実行中のプロセスを表示する
- top
まず、知っておくべき最も基本的なコマンドの1つがtopです。このツールは、システムで現在どのプロセスが実行されているかを視覚化するのに役立ちます。実行すると、以下のように表示されます。
|
1 |
top |

結果の上部には、システム統計が表示されます。これにより、システム負荷やタスク数などの情報が得られます。この例では、1つの実行中プロセスと55のアイドルプロセスがあることがわかります。アイドル状態またはスリープ状態のプロセスは、現在使用していないプロセスです。これは、それらがシステムリソースを占有していないことを意味します。最後に、ポップアップの下部付近に使用状況の統計とともに、すべての実行中のプロセスが表示されます。
- htop
このコマンドを使用する前に、以下を入力して実行し、リポジトリからインストールする必要があります。
|
1 |
sudo apt-get install htop |
インストールが完了すると、topと同様の情報を表示するために使用できます。主な違いは、htopコマンドを使用すると、よりユーザーフレンドリーな結果が得られる点です。
|
1 |
htop |

ご覧のとおり、この結果は理解しやすく、解釈も容易です。
psを使用したプロセスのリスト表示
上記のコマンドを使用して実行中のプロセスを表示することはできますが、すべてのシナリオをカバーできるとは限りません。幸いなことに、より強力で柔軟なツールが用意されています。それがpsコマンドです。
コマンドをそのまま実行した場合に何が表示されるかを見てみましょう。
|
1 |
ps |

この出力では、現在のユーザーおよびセッションに関連して実行されているすべてのプロセスを確認できます。ただし、これでは多くの情報は得られません。
システムで実行されているすべてのプロセスをより包括的に表示したい場合は、引数を使用する必要があります。引数を使用すると、端末の関連付けに関係なく、すべてのユーザーが所有するすべてのプロセスを表示できます。出力も非常にユーザーフレンドリーで読みやすい形式で表示されます。以下に例を示します。
|
1 |
ps aux |

一方で、この情報をツリー形式で視覚化することもできます。以下に示すように、階層関係も明らかになります。
|
1 |
ps axjf |

この例では、kthreaddがその後に続くプロセスの親としてどのように表示されているかを確認できます。
- プロセスIDとは?
LinuxまたはUnixのユーザーとして、プロセスIDについて知っておく必要があります。PIDとも呼ばれるこれらは、システムによって各プロセスに割り当てられる一意の識別子です。サーバーはこれらの識別子を使用して、個々のプロセスを追跡します。特定のプロセスのPIDを知るには、次のようにpgrepコマンドを使用する必要があります。
|
1 |
pgrep bash |
|
1 2 |
出力: 1340 |
システムを起動すると、最初のプロセスが実行を開始します。このプロセスはinitと呼ばれます。デフォルトの仕組みとして、initプロセスはPID「1」を取得します。このプロセスのPIDは次のように確認できます。
|
1 |
pgrep init |
|
1 2 |
出力: 1 |
その後、initプロセスは他のすべてのプログラムまたはプロセスを起動する責任を負います。当然のことながら、それに続くプロセスは、より大きい、または増加していくPIDを持つことになります。
- 親プロセスとは?
知っておくべきもう一つの概念は、親プロセスです。プロセスAがプロセスBを生成した場合、プロセスAはプロセスBの親プロセスになります。これらを区別しやすくするために、システムは親プロセスにPPIDを割り当てます。top、htop、psなどの管理コマンドを実行すると、列ヘッダーにこのPPIDが表示されているのが確認できます。
- 親子関係とは何ですか?
すでに知られているように、親プロセスは子プロセスを生成します。この作成は2つのステップで行われます。1つ目は fork() です。これは新しいアドレス空間を作成することから始まります。また、コピーオンライト(copy-on-write)を使用して親のリソースをコピーし、子プロセスでも利用できるようにします。2つ目は exec() です。これは、新しく作成されたアドレス空間に実行可能ファイルをロードして実行する役割を担います。
- 子プロセスが親プロセスよりも先に終了した場合はどうなりますか?
これが発生した場合、子プロセスはゾンビになります。つまり、親プロセスがそのプロセスに関する情報を収集するか、関連する情報が不要であることをカーネルに伝えるまでその状態が続きます。これが完了すると、そのプロセスが使用していたリソースが解放されます。
- 親プロセスが子プロセスよりも先に終了した場合はどうなりますか?
このシナリオでは、システムは子プロセスを別の親プロセスに再割り当てします。それは init または他のプロセスになります。
Linuxでのプロセスへのシグナル送信
シグナルを送信することで、特定のプロセスを応答させることができます。シグナルはオペレーティングシステムとの通信に役立ちます。シグナルを使用して、アプリケーションを終了、起動、または特定の動作やタスクを変更することができます。
- PIDを使用したシグナルの送信
Linuxでシグナルを送信するために使用できるユーティリティの1つが kill です。このコマンドは、その名の通り、プロセスを終了または強制終了(キル)するのに役立ちます。
|
1 |
kill PIDoftarget_process |
このユーティリティはプロセスに TERM シグナルを送信し、プロセスの終了を指示します。このコマンドにより、アプリケーションはクリーンアップを行ってスムーズに終了します。TERM シグナルでプログラムが正常に終了しない場合は、KILL シグナルを直接送ることで強制終了できます。
|
1 |
kill -KILL PIDoftarget_process |
このシグナルはプログラムには送られません。オペレーティングシステムのカーネルに送られます。カーネルはプロセスを直接シャットダウン(強制終了)します。これは、プログラムが送信されたシグナルを無視している場合に使用できます。
このコマンドでは、シグナル名をそれに関連付けられた番号に置き換えることもできます。たとえば、‘-TERM’ の代わりに ‘-15’ を使用できます。同様に、‘-KILL’ を ‘-9’ に置き換えることができます。
- さまざまな目的でのシグナルの使用
プログラムを強制終了または終了する以外にも、シグナルを使用して他の処理を行うことができます。たとえば、デーモンの再起動への対応が挙げられます。デーモンがハングアップシグナル(HUP)を受信するたびに、以下のようなプログラムでは再起動が行われます。Apache。これを行うには、次のシグナルを使用できます。
|
1 |
sudo kill -HUP pidofapache |
このコマンドにより、Apache は設定ファイルを再読み込みします。その結果、関連するコンテンツの提供を継続します。
kill ユーティリティで送信できるシグナルを確認したい場合は、次のコマンドを使用します。
|
1 |
kill -l |

- 名前によるシグナルの送信
従来は、プログラムの PID を使用してシグナルを送信していました。しかし、プロセスの通常の名前を使用してシグナルを送信することも可能です。これを行うには、pkill コマンドを使用します。これは kill コマンドと同様に動作します。唯一の違いは、プロセス名を使用できる点です。
|
1 |
pkill -9 ping |
この pkill コマンドは、次の kill コマンドと同等です。
|
1 |
kill -9 `pgrep ping` |
また、特定のプロセスではなく、すべてのインスタンスにシグナルを送信したい場合のコマンドもあります。次のコマンドは、システムで実行されているすべての Firefox インスタンスに TERM シグナルを送信します。
|
1 |
killall firefox |
プロセスの優先度の調整
Linuxコマンドで実行できるもう一つのことは、優先度の調整です。これは、サーバー環境においてどのプロセスを優先するかを決定できることを意味します。重要と考える特定のプロセスがあるかもしれません。他のプロセスはそれほど必要ではないかもしれません。システムは、リソースに余裕がある場合にのみ、後者のプログラムを実行します。
Linuxでは、nicenessコマンドを使用してプロセスの優先度を制御できます。この値は、優先度の高いタスクを「less nice(親切ではない)」、優先度の低いプロセスを「more nice(より親切)」として示します。このように考えてみてください。優先度の高いプロセスはリソースを独占しているため「親切ではない(less nice)」のです。優先度の低いタスクはリソースを共有しているため、より「親切(nice)」です。
topコマンドを実行すると、特定のプロセスのnice値を確認できます。この値は「NI」列に表示されます。優先度の高いタスクのnice値は「-19/-20」の範囲になります。優先度の低いプロセスは「19/20」の範囲になります。以下のように表示されます。
|
1 |
top |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
タスク: 56 合計, 1 実行中, 55 スリープ中, 0 停止中, 0 ゾンビ CPU(s): 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st メモリ: 1019600k 合計, 324496k 使用済み, 695104k 空き, 8512k バッファ スワップ: 0k 合計, 0k 使用済み, 0k 空き, 264812k キャッシュ PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1635 root 20 0 17300 1200 920 R 0.3 0.1 0:00.01 top 1 root 20 0 24188 2120 1300 S 0.0 0.2 0:00.56 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/0 |
自分で指定したnice値でプロセスを実行したい場合は、単にniceコマンドを使用するだけです:
|
1 |
nice -n 15 commandtoexecute |
このコマンドは、指定されたプログラムを起動するときにのみ機能します。すでに実行中のプログラムのnice値を変更したい場合は、reniceを使用する必要があります:
|
1 |
renice 0 PIDtoprioritize |
結論
ご覧の通り、ここでのツールはグラフィカルなツールとは大きく異なります。その結果、初心者にとっては理解するのが難しいかもしれません。このガイドは、コマンドに慣れるのに役立ちます。さらに練習を重ねることで、より深く理解し、より効率的に使用できるようになります。
Linuxサーバーをより適切に管理するのに役立つ、以下のチュートリアルを含む他のリソースもご覧ください:SSH鍵認証を使用するようにLinuxサーバーを構成する方法, whereis、which、whatis、readlink、findを使用してLinux VPSシステム上のファイルを特定する方法、およびLinux VPSで環境変数とシェル変数を読み取り、設定する方法.
ハッピーコンピューティング!
コメント
コメントはまだありません。最初のコメントを投稿しましょう。