Linuxでps、kill、niceを使用してプロセスを管理する方法

提供:Dev Guides
移動先:案内検索

序章

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があり、tophtoppsなどの多くのプロセス管理アプリケーションの列ヘッダーに表示されます。

プロセスに関するユーザーとオペレーティングシステム間の通信には、操作中のある時点でのプロセス名と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を使用して他のサーバーリソースを監視する方法を学習することをお勧めします。