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
信号を送り、可能であれば正常に停止するようにプロセスに指示します。
の改良版 top
、と呼ばれる htop
、ほとんどのパッケージリポジトリで利用できます。 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
、デフォルトで常にインストールされるわけではありませんが、ドロップインリプレースメントと見なすことができます。 終了できます htop
を押すことによって Ctrl+C
と同じように top
. 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
、またはhang-up信号。 Apache Webサーバーは通常、このように動作します。
- sudo kill -HUP pid_of_apache
上記のコマンドにより、Apacheは構成ファイルをリロードし、コンテンツの提供を再開します。
注:このような多くのバックグラウンドプロセスは、システムサービスを介して管理されます。これらのプロセスは、それらと対話するための追加のサーフェスを提供します。通常、 HUP
実行中の1つのプロセスに直接信号を送ります。 さまざまなサービスの構成ファイルを確認すると、さまざまなサービスが service restart
フックは、ログやその他のレポートを提供しながら、まさにそれを実行するように設計されています–特定のプロセスにシグナルを送信します–。
で送信できるすべての信号を一覧表示できます kill
とともに -l
国旗:
- 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を使用する方法ですが、通常のプロセス名を使用してこれを行う方法もあります。
The pkill
コマンドは、ほぼ同じように機能します kill
、ただし、代わりにプロセス名で動作します。
- pkill -9 ping
上記のコマンドは、次と同等です。
- kill -9 `pgrep ping`
特定のプロセスのすべてのインスタンスにシグナルを送信する場合は、 killall
指図:
- killall firefox
上記のコマンドは、TERMシグナルを次のすべてのインスタンスに送信します。 firefox
コンピューター上で実行しています。
ステップ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
他のサーバーリソースを監視する。