Linuxでps、kill、niceを使用してプロセスを管理する方法
序章
Linuxサーバーは、他の最新のコンピューターと同様に、複数のアプリケーションを実行します。 これらは、個別のプロセスと呼ばれ、管理されます。
Linuxは、プロセスのライフサイクル(つまり、起動、シャットダウン、メモリ割り当てなど)の低レベルの舞台裏の管理を処理しますが、オペレーティングシステムと対話してそれらを管理する方法が必要になります。より高いレベル。
このガイドでは、プロセス管理のいくつかの基本的な側面について学習します。 Linuxには、この目的のために多数の標準の組み込みツールが用意されています。
これらのアイデアはUbuntu20.04環境で検討しますが、最新のLinuxディストリビューションも同様に動作します。
ステップ1-Linuxで実行中のプロセスを表示する方法
topコマンドを使用すると、サーバーで実行されているすべてのプロセスを確認できます。
top
Outputtop - 15:14:40 up 46 min, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 56 total, 1 running, 55 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1019600k total, 316576k used, 703024k free, 7652k buffers
Swap: 0k total, 0k used, 0k free, 258976k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
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.07 ksoftirqd/0
6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
7 root RT 0 0 0 0 S 0.0 0.0 0:00.03 watchdog/0
8 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 cpuset
9 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper
10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
出力の最初の数行は、CPU/メモリの負荷や実行中のタスクの総数などのシステム統計を提供します。
実行中のプロセスが1つあり、CPUサイクルをアクティブに使用していないためにスリープと見なされる55のプロセスがあることがわかります。
表示される出力の残りの部分には、実行中のプロセスとその使用統計が表示されます。 デフォルトでは、topはこれらをCPU使用率で自動的にソートするため、最もビジーなプロセスを最初に確認できます。 topは、Ctrl+Cの標準キーの組み合わせを使用してシェルを停止し、実行中のプロセスを終了するまで、シェルで実行を継続します。 これにより、kill信号が送信され、可能な場合は正常に停止するようにプロセスに指示されます。
[X43X] と呼ばれるtopの改良版は、ほとんどのパッケージリポジトリで利用できます。 Ubuntu 20.04では、aptを使用してインストールできます。
sudo apt install htop
その後、htopコマンドが使用可能になります。
htop
Output Mem[||||||||||| 49/995MB] Load average: 0.00 0.03 0.05
CPU[ 0.0%] Tasks: 21, 3 thr; 1 running
Swp[ 0/0MB] Uptime: 00:58:11
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command
1259 root 20 0 25660 1880 1368 R 0.0 0.2 0:00.06 htop
1 root 20 0 24188 2120 1300 S 0.0 0.2 0:00.56 /sbin/init
311 root 20 0 17224 636 440 S 0.0 0.1 0:00.07 upstart-udev-brid
314 root 20 0 21592 1280 760 S 0.0 0.1 0:00.06 /sbin/udevd --dae
389 messagebu 20 0 23808 688 444 S 0.0 0.1 0:00.01 dbus-daemon --sys
407 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.02 rsyslogd -c5
408 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.00 rsyslogd -c5
409 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.00 rsyslogd -c5
406 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.04 rsyslogd -c5
553 root 20 0 15180 400 204 S 0.0 0.0 0:00.01 upstart-socket-br
htopは、複数のCPUスレッドの視覚化、最新の端末での色のサポートの認識、およびその他の機能の中でもより多くの並べ替えオプションを提供します。 topとは異なり、デフォルトで常にインストールされるとは限りませんが、ドロップインリプレースメントと見なすことができます。 topと同様に、Ctrl+Cを押すと、htopを終了できます。 topおよびhtopの使用方法の詳細を学ぶこともできます。
次のセクションでは、ツールを使用して特定のプロセスを照会する方法について学習します。
ステップ2–psを使用してプロセスを一覧表示する方法
topおよびhtopは、グラフィカルタスクマネージャーと同様に実行中のプロセスを表示するためのダッシュボードインターフェイスを提供します。 ダッシュボードインターフェイスは概要を提供できますが、通常は直接実行可能な出力を返しません。 このために、Linuxは、実行中のプロセスを照会するためのpsと呼ばれる別の標準コマンドを提供します。
引数なしでpsを実行しても、ほとんど情報が得られません。
ps
Output PID TTY TIME CMD 1017 pts/0 00:00:00 bash 1262 pts/0 00:00:00 ps
この出力には、現在のユーザーおよびターミナルセッションに関連付けられているすべてのプロセスが表示されます。 これは、現在この端末内でbashシェルとこのpsコマンドのみを実行している場合に意味があります。
このシステムのプロセスの全体像を把握するには、ps auxを実行します。
ps aux
OutputUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.2 24188 2120 ? Ss 14:28 0:00 /sbin/init root 2 0.0 0.0 0 0 ? S 14:28 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 14:28 0:00 [ksoftirqd/0] root 6 0.0 0.0 0 0 ? S 14:28 0:00 [migration/0] root 7 0.0 0.0 0 0 ? S 14:28 0:00 [watchdog/0] root 8 0.0 0.0 0 0 ? S< 14:28 0:00 [cpuset] root 9 0.0 0.0 0 0 ? S< 14:28 0:00 [khelper] …
これらのオプションは、psに、すべてのユーザーが所有するプロセスを(端末の関連付けに関係なく)より人間が読める形式で表示するように指示します。
パイプを利用することで、ps auxの出力内をgrepで検索し、特定のプロセスの名前を返すことができます。 これは、クラッシュしたと思われる場合、または何らかの理由で停止する必要がある場合に役立ちます。
ps aux | grep bash
Outputsammy 41664 0.7 0.0 34162880 2528 s000 S 1:35pm 0:00.04 -bash sammy 41748 0.0 0.0 34122844 828 s000 S+ 1:35pm 0:00.00 grep bash
これにより、実行したばかりのgrepプロセスと、現在実行中のbashシェルの両方が返されます。 また、合計メモリとCPU使用率、実行時間、および上記の強調表示された出力で、プロセスIDを返します。 LinuxおよびUnixライクなシステムでは、各プロセスにプロセスIDまたはPIDが割り当てられます。 これは、オペレーティングシステムがプロセスを識別して追跡する方法です。
プロセスのPIDを取得する簡単な方法は、pgrepコマンドを使用することです。
pgrep bash
Output1017
init と呼ばれる、起動時に生成される最初のプロセスには、「1」のPIDが与えられます。
pgrep init
Output1
このプロセスは、システム上の他のすべてのプロセスを生成する責任があります。 後のプロセスには、より大きなPID番号が与えられます。
プロセスのparentは、プロセスの生成を担当したプロセスです。 親プロセスにはPPIDがあり、top、htop、psなどの多くのプロセス管理アプリケーションの列ヘッダーに表示されます。
プロセスに関するユーザーとオペレーティングシステム間の通信には、操作中のある時点でのプロセス名とPID間の変換が含まれます。 これが、これらのユーティリティが常に出力にPIDを含める理由です。 次のセクションでは、PIDを使用して、実行中のプロセスに停止、再開、またはその他の信号を送信する方法を学習します。
ステップ3–Linuxでプロセス信号を送信する方法
Linuxのすべてのプロセスは、信号に応答します。 シグナルは、動作を終了または変更するようにプログラムに指示するオペレーティングシステムレベルの方法です。
プログラムに信号を渡す最も一般的な方法は、killコマンドを使用することです。 ご想像のとおり、このユーティリティのデフォルトの機能は、プロセスを強制終了しようとすることです。
kill PID_of_target_process
これにより、TERMシグナルがプロセスに送信されます。 TERMシグナルは、プロセスを終了するように指示します。 これにより、プログラムはクリーンアップ操作を実行し、スムーズに終了できます。
プログラムが誤動作していて、TERMシグナルが与えられたときに終了しない場合は、KILLシグナルを渡すことでシグナルをエスカレーションできます。
kill -KILL PID_of_target_process
これは、プログラムに送信されない特別な信号です。
代わりに、プロセスをシャットダウンするオペレーティングシステムカーネルに渡されます。 これは、送信された信号を無視するプログラムをバイパスするために使用されます。
各信号には、名前の代わりに渡すことができる番号が関連付けられています。 たとえば、「-TERM」の代わりに「-15」を渡し、「-KILL」の代わりに「-9」を渡すことができます。
信号は、プログラムをシャットダウンするためだけに使用されるわけではありません。 また、他のアクションを実行するために使用することもできます。
たとえば、バックグラウンドで常に実行されるように設計された多くのプロセス(「デーモン」と呼ばれることもあります)は、HUPまたはハングアップ信号が与えられると自動的に再起動します。 Apache Webサーバーは通常、このように動作します。
sudo kill -HUP pid_of_apache
上記のコマンドにより、Apacheは構成ファイルをリロードし、コンテンツの提供を再開します。
注:このような多くのバックグラウンドプロセスは、システムサービスを介して管理されます。これらのプロセスは、それらと対話するための追加のサーフェスを提供します。通常、HUPは1つの実行中のプロセスに直接信号を送ります。 さまざまなサービスの構成ファイルを確認すると、さまざまなservice restartフックが、ログやその他のレポートを提供しながら、まさにそれを実行するように設計されていることがわかります。
[X62X]フラグを使用してkillで送信できるすべての信号を一覧表示できます。
kill -l
Output1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
信号を送信する従来の方法はPIDを使用する方法ですが、通常のプロセス名を使用してこれを行う方法もあります。
pkillコマンドは、killとほぼ同じように機能しますが、代わりにプロセス名で機能します。
pkill -9 ping
上記のコマンドは、次と同等です。
kill -9 `pgrep ping`
特定のプロセスのすべてのインスタンスにシグナルを送信する場合は、killallコマンドを使用できます。
killall firefox
上記のコマンドは、コンピュータで実行されているfirefoxのすべてのインスタンスにTERM信号を送信します。
ステップ4–プロセスの優先順位を調整する方法
多くの場合、サーバー環境で優先されるプロセスを調整する必要があります。
一部のプロセスは、状況にとってミッションクリティカルと見なされる場合がありますが、他のプロセスは、リソースが残っている場合は常に実行される場合があります。
Linuxは、nicenessという値を使用して優先度を制御します。
優先度の高いタスクは、リソースも共有しないため、優れたとは見なされません。 一方、優先度の低いプロセスは、最小限のリソースのみを使用することを要求するため、優れたです。
記事の冒頭でtopを実行すると、「NI」とマークされた列がありました。 これは、プロセスのnice値です。
top
[secondary_label Output]
Tasks: 56 total, 1 running, 55 sleeping, 0 stopped, 0 zombie
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
Mem: 1019600k total, 324496k used, 695104k free, 8512k buffers
Swap: 0k total, 0k used, 0k free, 264812k cached
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
適切な値は、システムに応じて-19 / -20(最高の優先度)から19/20(最低の優先度)の範囲になります。
特定の適切な値でプログラムを実行するには、niceコマンドを使用できます。
nice -n 15 command_to_execute
これは、新しいプログラムを開始するときにのみ機能します。
すでに実行されているプログラムの適切な値を変更するには、reniceというツールを使用します。
renice 0 PID_to_prioritize
結論
プロセス管理はLinuxの基本的な部分であり、ほとんどすべてのコンテキストで役立ちます。 実践的なシステム管理を行っていない場合でも、スタックしたプロセスを追跡して慎重に処理できると非常に役立ちます。
次に、netstatおよびduを使用して他のサーバーリソースを監視する方法を学習することをお勧めします。