1. 概要

Linuxは、プロセスを終了または強制終了するためのいくつかのコマンドを提供します。 使用する基本的なシステムコールは似ていますが、それぞれに独自の利点があります。

この短いチュートリアルでは、各コマンドの利点と、それぞれが優れている例を示します。

2. kill システムコールとは何ですか?

Linuxでは、システムコールはカーネル機能にアクセスするためのインターフェースです。 低レベルのタスクは、カーネルに実行を依頼することで実行できます。

プロセスを終了するには、killシステムコールを使用できます。 プロセスIDとプロセスを強制終了するときに送信するsignalの2つの引数を取ります。

シグナルは、プロセスを強制終了する理由を示します。 名前と関連番号で構成されています。 プロセスは、受信するシグナルに応じて異なる応答をします。殺しているプロセスに送信できるシグナルはたくさんありますが、最も人気のあるものをいくつか見てみましょう。

シグナルSIGTERM(15)または SIGINT(2)を送信して、プロセスを正常にシャットダウンするように依頼できます。 プロセスはこの要求を無視できます。

SIGKILL(9)または SIGSTOP( 19)を送信できますが、これらは無視できません。 SIGKILL はプロセスを強制的に終了し、SIGSTOPはプロセスを一時停止します。

このチュートリアルでは、プロセスの終了に焦点を当てますが、シグナルのおかげで、kill呼び出しをより広く使用できます。 たとえば、プロセスを一時停止して再開したり、構成をリロードさせたりすることができます。

コマンドがこのシステムコールをどのように使用するかを見てみましょう。

3. キル

kill コマンドは、システムコール最も単純なラッパーです。 プロセスIDが必要であり、デフォルトでは、SIGTERMシグナルをプロセスに送信します。 これを使用するには、最初にpsコマンドでプロセスIDを見つける必要があります。

$ ps x
   PID TTY      STAT   TIME COMMAND
...
  15709 pts/0    Ss     0:00 bash
  16299 ?        Sl     0:00 /usr/bin/gedit --gapplication-service
  16405 pts/0    R+     0:00 ps x

geditを終了したいとします。 次のコマンドを実行できます。

$ kill 16299

確実に終了したい場合は、SIGKILLを渡すことができます。

$ kill -9 16299
# Or by signal name kill -SIGKILL 16299

killコマンドは簡単です。 使用するPIDを見つけるだけで済みます。 PIDが存在しない場合、コマンドはエラーを返すため、これは利点です。

4. pkill

ほとんどの場合、プロセスを終了するときは、その名前も知っています。 これがpkillがとても便利な理由です。 これで、名前を使用してgeditプロセスを強制終了できます。

$ pkill gedit

このコマンドは、唯一の必要な引数としてパターンを取ります。 そのパターンはすべてのプロセス名と照合され、照合されたプロセスは終了します。 これも両刃の剣です。終了するつもりのないプロセスを終了できるからです。

最初にパターンに一致するプロセスを確認することをお勧めします。 そのためにpgrepを使用できます。

$ pgrep -a gedit
16299 /usr/bin/gedit --gapplication-service

これで、pkillを自信を持って使用できるようになりました。

kill コマンドと同様に、送信されるデフォルトの信号はSIGTERMです。 次の方法で強制終了できます。

$ pkill -9 gedit

pkillでできる他の興味深いことがあります。 たとえば、検索を特定のユーザーに属するプロセスに制限できます。

$ pkill -u myuser,otheruser gedit

または、一致するプロセスを除くすべてのプロセスを強制終了します。

$ pkill -u myuser --inverse gedit

5. killall

最後に、killallも便利なコマンドです。 デフォルトでは、はname引数と完全に一致するプロセスのみを終了します。 たとえば、このコマンドはプロセスを検出しません。

$ killall gedi

ただし、 pkill を使用している場合は、同じ引数が機能します。 プロセスの名前を知っていて、意図せずに一致させたプロセスを強制終了しないようにしたい場合、これは明確な利点です。

他のコマンドと同様に、これも-SIGKILL-9のようなシグナルを引数として受け入れます。 kill と同様に、引数に一致するプロセスがない場合、このコマンドはエラーを返します。

pkill コマンドと同様に、次の方法で個々のユーザーのすべてのプロセスを終了することもできます。

$ killall -u otheruser

2つの特徴により、killallはユニークです。 まず、インタラクティブに実行して、適切なプロセスが見つかったことを確認できます。

$ killall -i gedit
Kill gedit(16299) ? (y/N)

次に、開始時間に基づいてプロセスを終了できます。 たとえば、1時間前またはそれ以前に開始されたすべての gedit プロセスを終了するには、次のコマンドを実行できます。

$ killall -i --older-than 60m gedit
Kill gedit(16299) ? (y/N)

または、過去2時間に開始されたすべてのgeditプロセスを終了することもできます。

$ killall -i --younger-than 2h gedit
Kill gedit(16299) ? (y/N)

6. 結論

この短いチュートリアルでは、 kill pkill、、およびkillallを使用してプロセスを終了する方法を説明しました。 ただし、3つの間には微妙な違いがあり、それらを理解することは、仕事に適したツールを選択するのに役立ちます。