このチュートリアルでは、複数の例を使用してLinuxでプロセスを強制終了する方法について説明します。ほとんどの場合、「kill」コマンドに続けてプロセスID(通常はPIDと略されます)を入力するだけです。
ご覧のとおり、IDが1813のプロセスを強制終了しました。
Windowsユーザーの場合、「kill」コマンドは、Windowsタスクマネージャー内の「タスクの終了」ボタンに相当するLinuxのコマンドと考えると役立つ場合があります。
実行中のプロセスのリスト
「ps-e」コマンドは、システムで実行されているすべてのものを一覧表示します。最小限のインストールでも、コマンドはおそらく80を超える結果を出力するため、コマンドを「grep」または「more」にパイプする方がはるかに簡単です。
ps -e | grep name-of-process
以下のスクリーンショットでは、SSHがシステムで実行されているかどうかを確認しています。
これにより、SSHデーモンのPID(1963年)もわかります。
システムで実行中のプロセスを1つずつ確認する場合は、「詳細」にパイプします。
実行中のプロセスのリストを表示するために、「top」コマンドを使用することもできます。これは、各プロセスが使用しているシステムリソースの数を示すので便利です。
リソースのPID、ユーザー、および名前はすべてここで識別されます。これは、後でこれらのサービスのいずれかを強制終了する場合に役立ちます。
%CPU列と%MEM列に注意してください。重要でないプロセスが貴重なシステムリソースをかみ砕いていることに気付いた場合は、それを強制終了することがおそらく有益です。
対応するプロセスIDを取得するもう1つの非常に効率的な方法は、「pgrep」コマンドを使用することです。指定する必要がある唯一の引数は、実行中のプロセスの名前(または名前の一部)です。
SSHを検索すると次のようになります。ご覧のとおり、2506のプロセスIDを返します。
PIDでプロセスを強制終了します
SSHデーモンのPIDがわかったので、killコマンドを使用してプロセスを強制終了できます。
$ sudo kill 1963
プロセスが実際に強制終了されたことを確認するために、最後の「ps」コマンドを発行できます。
$ ps -e | grep ssh
結果は空になります。これは、プロセスが正常にシャットダウンされたことを意味します。プロセスが実行を継続していることに気付いた場合(通常は発生しないはずです)、次のセッションで説明するように、プロセスに別の強制終了シグナルを送信してみることができます。
注:プロセスを終了するために、必ずしも「sudo」またはrootユーザーアカウントを使用する必要はありません。前の例では、rootユーザーの下で実行されるSSHデーモンを終了していました。したがって、プロセスを終了するには適切な権限が必要です。
killコマンドによって送信されるデフォルトのシグナル
デフォルトでは、killコマンドはSIGTERMシグナルを送信します 指定したプロセスに。
これにより、SIGTERMがプロセスに通常のシャットダウン手順を実行するように指示するため、プロセスを正常に終了できるようになります。つまり、プロセスが突然終了することはありません。
プロセスを意図したとおりにシャットダウンする必要があるため、これは良いことです。
ただし、SIGTERMシグナルでは、プロセスを強制終了できない場合があります。 killコマンドを実行し、プロセスがまだ実行中であることに気付いた場合、プロセスはまだシャットダウンプロセスを実行しているか、完全にハングアップしている可能性があります。
強制殺害
プロセスを強制的に閉じて通常のシャットダウンを中止するには、次に示すように、-9スイッチを使用してSIGKILLシグナルを送信できます。
$ kill -9 processID
常に機能するため、killコマンドに-9スイッチを常に追加したくなる場合があります。ただし、これは推奨されるベストプラクティスではありません。ハングアップして適切にシャットダウンすることを拒否しているプロセスでのみ使用する必要があります。
可能であれば、デフォルトのSIGTERMシグナルを使用してください。これにより、プロセスにログファイルを閉じたり、長引く接続を終了したりする機会が与えられるため、長期的にはエラーを防ぐことができます。
SIGTERMシグナルとSIGKILLシグナルとは別に、killがプロセスに送信できるシグナルは他にもたくさんあります。これらはすべて、-lスイッチで確認できます。
名前の横の数字は、「kill」コマンドで指定するものです。たとえば、上のスクリーンショットにあるように、kill-9はSIGKILLです。
日常の操作では、おそらくSIGTERMとSIGKILLが、使用する必要のない唯一のシグナルです。プロセスが別の信号で終了することを推奨する奇妙な状況に備えて、他の人のことを覚えておいてください。
名前ですべてのプロセスを強制終了するにはどうすればよいですか?
pkillコマンドでは、PIDではなく実行中のプロセスの名前を使用することもできます。ただし、これによりすべてが終了することに注意してください killは、終了しようとしている特定のプロセスを認識しないため、指定された名前で実行されているプロセス。
$ pkill name-of-process
以下の例を確認してください。ここでは、1つのpkillコマンドで5つのプロセスを終了しています。
この例では、これらの画面セッションの1つだけを終了したかったのです。 PIDを指定し、通常の「kill」コマンドを使用する必要があります。そうしないと、終了するプロセスを一意に指定する方法がありません。
ユーザーがすべてのプロセスを強制終了する方法
pkillコマンドを使用して、Linuxユーザーが実行しているすべてのプロセスを終了することもできます。まず、特定のユーザーの下で実行されているプロセスを確認するには、-uスイッチを指定してpsコマンドを使用します。
$ ps -u username
このスクリーンショットは、ユーザー「オタク」の下で現在5つのサービスが実行されていることを示しています。それらすべてをすばやく終了する必要がある場合は、pkillを使用して終了できます。
$ pkill -u username
nohupプロセスを強制終了する方法は?
他の実行中のプロセスと同じ方法でnohupプロセスを強制終了できます。 psコマンドで「nohup」をgrepすることはできないため、上記と同じ方法を使用して実行中のプロセスを検索する必要があることに注意してください。
この例では、nohupコマンドで実行された「test.sh」というタイトルのスクリプトが見つかります。ご覧のとおり、それを見つけて終了することは、上記の例とほとんど同じです。
出力との唯一の違いは、シェルがプロセスが終了したことを通知することです。これはkillの一部ではなく、スクリプトをバックグラウンドで実行し(この例ではアンパサンド)、スクリプトが開始されたのと同じttyに接続された結果です。
$ nohup ./test.sh &
バックグラウンドでプロセスを実行するにはどうすればよいですか?
killコマンドは、バックグラウンドで実行しているプロセスを終了するための効率的な方法です。このチュートリアルではプロセスを強制終了する方法をすでに学習しましたが、プロセスをバックグラウンドで実行する方法を知っていることは、killコマンドで使用するための効果的な組み合わせです。
コマンドをバックグラウンドで実行するために、コマンドにアンパサンド(&)を追加できます。これは、実行に時間がかかり、その間に他のタスクを実行したいコマンドやスクリプトに役立ちます。
ここでは、単純な「ls」コマンドをバックグラウンドに配置しました。これは実行にほとんど時間がかからないタイプのコマンドであるため、直後にジョブを終了したことについて、より多くの出力が提供されます。
スクリーンショットの出力には「完了」と表示されています。これは、バックグラウンドでのジョブが正常に完了したことを意味します。代わりにジョブを強制終了すると、出力に「終了」と表示されます。
キーボードのCtrl+Zを押して、ジョブをバックグラウンドに移動することもできます。このスクリーンショットの^Zは、Ctrl + Zを押して、test.shスクリプトがバックグラウンドに移動したことを示しています。
psコマンドを発行すると、test.shがバックグラウンドで実行され続けることがわかります。
$ ps -e | grep test.sh
画面コマンドの使用
バックグラウンドでプロセスを実行する別の方法は、「screen」コマンドを使用することです。これは、基本的に別のターミナルウィンドウ(または画面、したがって名前)に相当するものを作成することによって機能します。
作成する各画面にはプロセスIDがあります。これは、後でkillコマンドを使用して終了できるバックグラウンドプロセスを効率的に作成する方法であることを意味します。
Screenコマンドは、デフォルトですべてのLinuxインストールに付属しているわけではないため、インストールする必要がある場合があります。
UbuntuおよびDebianベースのディストリビューションでは、次のコマンドを使用してインストールできます。
$ sudo apt-get install screen
screenコマンドをインストールしたら、「screen」と入力するだけで新しいセッションを作成できます。:
$ screen
ただし、その前に、画面の名前を指定する習慣を身に付けることをお勧めします。そうすれば、後で簡単に検索して特定できます。名前を指定するために必要なのは、-Sスイッチだけです。
$ screen -S my-screen-name
「テスト」という画面を作成し、「kill」コマンドで終了してみましょう。このように始めます:
このコマンドを入力してEnterキーを押すと、新しく作成された画面がすぐに表示されます。ここで、バックグラウンドで実行したいプロセスを開始できます。
これは、サーバーにSSHで接続していて、切断した後も実行を継続するプロセスが必要な場合に特に便利です。
コマンド/スクリプトを実行しているときに、Ctrl + Aを押してからDを押すと画面から切断できます(Dキーを押す前にCtrlキーとAキーを放します)。
ご覧のとおり、screenコマンドは、画面を切り離すとすぐにプロセスIDを一覧表示します。もちろん、killコマンドを使用して、この画面(およびその中で実行されているコマンド/スクリプト)を終了することもできます。
次のコマンドを使用して、画面セッションのプロセスIDを簡単に検索できます。
$ screen -ls
-Sスイッチを使用して画面セッションに名前を付けなかった場合は、プロセスID自体のみが一覧表示されます。リストされている画面のいずれかに再接続するには、-rスイッチを使用できます:
$ screen -r name-of-screen
または
$ screen -r PID
以下のスクリーンショットでは、作成した画面セッションを(その内部で実行されているものとともに)強制終了し、プロセスが実際に終了したことを確認するために別のscreen-lsコマンドを発行しています。
バックグラウンドプロセスを強制終了する方法
前のセクションの例の1つでは、tesh.shスクリプトをバックグラウンドで実行するように配置しました。ほとんどのバックグラウンドプロセス、特に単純なコマンドは、面倒なことなく終了します。
ただし、他のプロセスと同様に、バックグラウンドのプロセスは簡単にシャットダウンを拒否する場合があります。 test.shスクリプトのPIDは2382なので、次のコマンドを発行します。
$ kill 2383
ただし、スクリーンショットでは、スクリプトがkillコマンドを無視していることがわかります。
すでに学習したように、kill -9は、ハングしたプロセスや終了を拒否したプロセスを強制終了するための最良の方法です。
停止したプロセスを強制終了する方法
停止したバックグラウンドジョブが蓄積されて役に立たなくなった場合は、それらを一度にすべて終了すると便利です。例として、test.shスクリプトの3つのインスタンスをバックグラウンドで実行し、それらを停止しました:
$ ./test.sh &
これらのプロセスは、psコマンドで確認できます。
$ ps -e | grep test.sh
または、システムで停止しているすべてのジョブのリストを取得するには、jobsコマンドを実行します。
$ jobs
停止したすべてのジョブを強制終了する最も簡単な方法は、次のコマンドを使用することです。
$ kill `jobs -ps`
または、-9スイッチを使用して、ジョブがすぐに終了することを確認します。
$ kill -9 `jobs -ps`
`jobs -ps`コマンドは、バックグラウンドで実行されているすべてのジョブのPIDを一覧表示します。そのため、停止したすべてのプロセスを終了するために、その出力をkillコマンドと組み合わせることができます。
キル操作は許可されていません
プロセスを強制終了しようとしたときに「操作が許可されていません」というエラーが発生する場合は、適切な権限がないことが原因です。 rootアカウントにログインするか、killコマンドの前に「sudo」(Debianディストリビューションの場合)を使用してください。
$ sudo kill PID
チュートリアルがお役に立てば幸いです。戻ってきてください。