ps、pgrep、pkillなどを使用したLinuxプロセスのマスター

Linuxのプロセス管理は、初めてのシステム管理者(sysadmin)には困難に見えるかもしれません。しかし、少しの説明とデモンストレーションを通じて、Linuxのプロセスを検索し実行する方法は、pskillなどのコマンドラインツールを使用するだけのことです。

この記事では、実行中および異常なプロセスを検索し、実行中のプロセスを終了させるためのコマンド、バックグラウンドプロセスの検索など、Linuxオペレーティングシステムのどのバージョンでも使用できるプロセス管理コマンドについて学ぶことができます。

この記事の最後まで読むと、Linuxのプロセス管理をコマンドラインからプロセス識別番号(PID)に基づいて行えるようになります。プロセス管理コマンドについてすべて学ぶために、読み続けましょう!

前提条件

この記事では、Linuxでプロセスを管理する方法について詳しく説明します。実際に手を動かして試す場合、以下が必要です。

  • A Linux host, which can be a virtual machine or a physical machine.
  • PowerShellの例を試すには、LinuxホストにPowerShell 7.1.1をインストールしてください。
  • A non-root user account. While root access is not required, there will be an example where the root user can kill the running process of another user.

使用するLinuxのディストリビューションはお好みで選んでください。この記事はUbuntu 20.04 LTSをベースにしていますが、コマンドはLinuxオペレーティングシステムに共通しています。

では、始めましょう。

Linuxでのプロセス管理

たまに、Linuxシステム上で実行中のプロセスを停止する必要がある場合があります。例えば、スケジュールで実行されるbashスクリプトがあるかもしれません。そのbashスクリプトは、別のユーザーとして設定されたcronジョブ(Linuxプロセススケジューラ)として実行されます。

このスクリプトは時々、スクリプト自体が失敗する可能性のある誤ったプロセスを生成します。システムを再起動したり、スクリプトを停止したりせずに、どのようにしてそれらの誤ったプロセスを終了させることができるでしょうか?

次のセクションでは、Linuxシステム上でプロセスを検出し、終了またはキルするために使用されるコマンドについて説明します。各セクションは前のセクションに基づいて構築されます。Linuxに固有のpstoppgrepkill、およびpkillコマンドについて学びます。

ボーナスとして、PowerShellの同等のコマンドGet-ProcessStop-Processも含まれています。Linuxのネイティブコマンドが好みでない場合に使用できます。

プロセスの検出ツール

プロセスを終了させる前に、正確な対象プロセスを特定する必要があります。一意のPIDを使用して正確に対象を特定できます。終了するための正しいプロセスを特定する方法について学びましょう。

psコマンドを使用してプロセス情報を表示する

プロセスの状態またはpsコマンドは、Linuxシステム上のアクティブなプロセスに関連する情報を表示します。psを使用して実行中のプロセスやバックグラウンドプロセスを見つけることができます。

psコマンドは、デフォルトで現在のユーザーの有効なユーザー識別子(EUID)に関連するすべてのプロセスを表示します。以下に示すように、psコマンドを実行すると、ユーザーが終了できるすべての実行中のプロセスが返されます。

ps
Displaying processes matching the EUID (effective user ID) for the user bkindle.

topコマンドを使用して拡張プロセス情報を検索する方法

実行中のプロセスとシステムメトリックの定期的に更新される情報を見つけたい場合は、topコマンドを使用することができます。 psとは異なり、topコマンドは一定の間隔で画面上のプロセス情報を更新します。

topコマンドを実行すると、PIDだけでなく、プロセスの詳細にはCPU使用率、メモリ使用率、Nice値(CPUスケジューリングプロセスの優先度)、Linuxカーネルによって設定されたプロセスの優先度(PR)も含まれます。

新人または経験豊富なシステム管理者にとって、topコマンドはシステムリソースとプロセスの管理における主要なツールです。以下に示すように、topコマンドの出力には、psコマンドよりも詳細なプロセス情報や全体的なシステムメトリックが表示されます。

The top command on Ubuntu Desktop 20.04 LTS showing all running PID’s.

htopは、カラー表示されるターミナル出力などの様々な改善点を含んだ、topの強化版です。

例えば、プロセスが消費しているメモリやCPUリソースを調査したい場合、以下のようにtoppスイッチを使用することができます。

top -p 2113
The top command displaying information on only one PID, 2113.

特定のユーザーの実行中のすべてのプロセスを表示する必要があるかもしれません。topコマンドには、uスイッチがあり、特定のユーザーのプロセスのみを表示することができます。以下の例では、ユーザーIDがbkindleに一致するPIDが表示されています。

top -u bkindle
The top command displaying only processes for the user bkindle.

pgrepコマンドを使用して特定のプロセスのPIDを検索する

pgrepはもともとSolarisのコマンドでしたが、Linuxで使用するために移植されました。grepコマンドの検索力とpsのプロセス管理を組み合わせることで、pgrepは対象のプロセスを正確に見つける柔軟性を提供します。

psはより詳細な情報を表示しますが、pgrepは返されたプロセスのPIDのみを返すように設計されています。pgrep多くの利用可能な検索パラメータを使用してプロセスを特定するのに役立ちます。次の例では、pgrepvmtoolsdに一致するプロセスを検索している様子が示されています。

pgrep vmtoolsd
Using pgrep to obtain all PIDs associated with vmtoolsd.

同様に、uスイッチを使用して特定のユーザーに関連するプロセスのみを取得するためのユーザーIDを指定します。以下のように、ユーザーbkindlevmtoolsdプロセスに対しては、単一のPIDのみが返されます。

pgrep -u bkindle vmtoolsd
Retrieving the specific PID for the vmtoolsd process associated with the user bkindle.

PowerShellのGet-Processを使用してLinuxでプロセスを検索する

典型的なLinuxコマンドは非常に優れていますが、PowerShellはLinuxのプロセスも管理できることをご存知でしょうか? Get-ProcessコマンドレットはLinuxのpsコマンドと似たような働きをし、プロセス情報を返します。例えば、現在のユーザーbkindleによって実行されているすべてのプロセスを検索する必要があるかもしれません。以下のように、ユーザーbkindleのすべてのPID(Get-ProcessでIDと表示される)を検索します。

Get-Process -IncludeUserName |
	Where-Object {$_.UserName -eq 'bkindle'} |
	Select-Object -Property 'Id','UserName','ProcessName'
Retrieving Linux PID’s with PowerShell’s Get-Process cmdlet.

関連記事:PowerShell Where-Objectを使用してすべてのものをフィルタリングする方法

さまざまなプロセスを見つける方法を学んだので、次はLinuxでプロセスを終了または削除する方法をすべて紹介します!

LinuxでのKillコマンドを使用してプロセスを終了する

前のセクションでは、ネイティブのLinuxおよびPowerShellコマンドを使用して、キルシグナルを送信するプロセスのPIDを特定する方法を学びました。次のセクションでは、killおよびpkillプログラム、それに関連するシグナル、およびコマンドラインスイッチの使用方法を説明します。

Linuxのシグナルとプロセス管理

シグナルは、Linuxがオペレーティングシステム内で実行されているプロセスとの通信に使用する方法です。 killコマンドがプロセスを終了するために使用する3つの主要なシグナルは次のとおりです:

  • 1(SIGHUP)- インタラクティブなプログラムを終了し、デーモン(バックグラウンドサービス)が使用する設定ファイルを再読み込みします。
  • 9(SIGKILL)- プロセスを優雅なシャットダウンのタスクを実行せずに終了させます。
  • 15(SIGTERM)- プロセスを優雅に終了させるために、完了時に開いているファイルを閉じるなどの処理を行います。これは、killコマンドを使用する際に番号が指定されていない場合にデフォルトで使用されるシグナルです。

この記事では、プロセスを終了するために使用される3つの主要なシグナルに焦点を当てていますが、合計64の利用可能なシグナルがあります。シグナルとそれに対応する番号のリストを取得するには、kill -lを使用します。

Great video on understanding process signals

プロセスを終了するために使用される3つの主要なシグナルを理解したので、次のセクションでプロセスを終了する方法を学びましょう。

killコマンドを使用してプロセスを終了する

次の例では、killコマンドを使用します。一時的にpwshという名前のPowerShellインスタンスを実行しており、割り当てられたPIDは22687です。このプロセスを終了する方法の一つを以下に示します。

  1. killコマンドで使用するpwshプロセスのPIDを特定するためにpgrep pwshを使用します。
  2. kill -s TERM 22687を使用して、pwshプロセスを正常に終了させます。TERMコマンドは15(SIGTERM)シグナルにマップされ、killコマンドのsパラメーターで指定されます。
  3. topps、またはpgrepのいずれかを使用して、PIDがもはやリストされていないことを確認します。

以下に、Ubuntu 20.04 LTSのbashターミナルから上記のプロセスの例を示します。

Using kill and associated commands to terminate the pwsh process.

killallコマンドは、PIDではなく名前に基づいてすべてのプロセスを終了します。このコマンドは注意して使用しないと非常に破壊的ですが、このコマンドを使用する場合は、iオプションを使用して確認を求めるようにします。

pkillを使用して名前でプロセスを終了する

killコマンドはプロセスIDのみで動作することに気づいたかもしれません。これにより、プロセスの終了が複雑な多段階のプロセスになる可能性があります。パッケージに含まれているprocpsおよびprocps-ngpkill コマンドは、検索された名前に基づいてプロセスを終了します。

機能的には、pkillコマンドはpgrepプログラムのラッパーとして動作します。pkillコマンドは、指定された信号を見つけたプロセスごとに送信し、端末にPIDをリスト表示するだけでなく、pkillkillと異なり、プロセスの名前のみを使用でき、PIDは使用できません。

Ubuntu 20.04 LTSでは、デフォルトでpkillコマンドは利用できません。アプリケーションをダウンロードしてインストールする必要があります。そのためには、sudo apt install mcollective-plugins-process -yを実行します。

pkillを使用してプロセスを終了するには、以下の手順を実行します:

  1. psを使用して、nanoアプリケーション(コマンドラインテキストエディタ)が現在実行中であることを確認します。このステップはオプションですが、プロセスを終了する前の安全チェックです。
  2. pkill -9 nanoを使用して、nanoアプリケーションを強制的に終了します。

以下に、Ubuntu 20.04 LTSのbashターミナルから上記のプロセスの例を示します。

Using the pkill command to forcefully terminate the nano process.

Topコマンドでプロセスを終了する

実行中のプロセスを表示するためにtopコマンドを実行すると、kキーを押すことで指定したプロセスを終了することができます。プロセスを終了するPIDを求めるインタラクティブなプロンプトが表示されます。

下に示すように、topコマンドを実行し、kを押します。終了させたいPIDを入力し、Enterキーを押すと、PIDが即座に終了します。

Use top to specify a process to terminate using the k keystroke.

次に、PowerShellのStop-Processコマンドを使用した、ネイティブなLinuxコマンドのもう一つの代替手段を学びましょう!

PowerShellのStop-Processコマンドを使用してプロセスを終了する

Linuxのネイティブコマンドがお好みでない場合、PowerShellを使用することもできます!killコマンドと同様に、Linuxで Stop-Processコマンドレットを使用してプロセスを終了することができます。再度、PowerShellのpwshプロセスを実行していると仮定します。

  1. Get-Process -ProcessName 'pwsh'と入力してPIDを見つけ、終了するためのPIDをメモしてください。
  2. Stop-Process -Id 29992,30014を使用して複数のプロセスを終了します。
  3. Get-Process -ProcessName 'pwsh'を使用してPIDを確認し、2999230014が一覧に表示されなくなっていることを確認してください。これは、それらが終了されたことを意味します。

また、Get-Processkillメソッドを使用して、1つまたは複数のプロセスを終了することもできます:(Get-Process -Id [PID]).Kill()または(Get-Process -Id [PID1,2,3,4]).Kill()

ProcessNameパラメータを使用する場合は注意してください。このパラメータを使用すると、killallコマンドと同様に、指定された名前に一致するすべてのプロセスが終了します

以下は、Ubuntu 20.04 LTSのbashターミナルで上記のプロセスの例です。

Using PowerShell, Stop-Process to kill processes in Linux.

次の手順

あなたはLinuxでプロセスを見つけて終了するための多くの方法を知っているはずです!次の挑戦として、SSH接続を使用してプロセスをリモートで終了させるか、コンテナで実行されている可能性のあるプロセスを終了させてみてください。

関連記事:Windowsの人がLinuxの世界で: LinuxでSSHを設定する

Source:
https://adamtheautomator.com/linux-kill-process/