プロセスを終了させることができるコマンドに、killコマンドがある。このコマンドは正確に言うとプロセスを終了させるのではなく、プロセスにシグナルを送信するためのコマンドだ。シグナルのなかに「プロセスの終了」や「強制終了」を実行するものがあり、実際それらの用途で使われることが多く、コマンド名も「kill」なので、そういった誤解が生じるのは当然かもしれない。今回はこのコマンド「kill」について説明しよう。
killコマンドの用途
killコマンドにはいくつか使い方があるのだが、代表的なのは「kill プロセスID」または「kill -9 プロセスID」といった使い方だろう。前者はプロセスの終了、後者はプロセスの強制終了だ。終了対象となるプロセスIDは、psコマンドなどを使って調べることになる。
killコマンドは、問題を起こしたプロセスを終了させるために利用する。とは言え、広く一般的に使われているサーバを特に拡張機能も使ったりせずに運用している限り、サーバが暴走することはあまりない。さらに、暴走したプロセスはどこかのタイミングでカーネルによって終了されることが多いので、そうした用途で明示的にkillコマンドを使うことはないかもしれない。
どちらかと言えば、killコマンドはGUIアプリケーションの強制終了目的で使うことが多いように思う。Google Chromeをはじめ、現在の主要ブラウザはマルチプロセスアーキテクチャを採用しており、1つのアプリケーションが複数のプロセスで構成されている。そのため、どれが1つのプロセスに問題が発生すると、一見終了したように見えるにもかかわらず実際にはアプリケーションが終了しておらず、アプリケーションを新しく起動することができないといった状況に陥ることがある。
例えば、macOSでGoogle ChromeやFirefoxを使っているとしよう。既にこれらブラウザは終了済みで、次に使いたいタイミングで起動するものとする。しかし、実際には終了すべきプロセスが終了せずにいて、新しく起動できないといったことがある。プラグイン関連のプロセスが終了できていないなど、よくあるケースだ。
こうした状態になるとGUIからはどうにもできず(やろうと思えばできなくもないが)、途方に暮れることになる。結局、システムを再起動して問題の解決を図るわけだが、使っているシステムをいったん終了して、もう1度元に戻すというのは面倒だ。できれば避けたい。
そこで、killコマンドが使えると便利だ。例えば、Firefoxの挙動がおかしくなったとする。まずは、psコマンドで次のようにFirefox関連のプロセスを一覧表示させよう。
上記の出力から、Firefox関連のプロセスのプロセスIDが67381、67456、67464、67488であることがわかる。この場合「kill -9 67381 67456 67464 67488」のようにkillコマンドを実行すれば、Firefox関連のプロセスを強制終了させることができる。終了後、もう一度psコマンドでプロセス一覧を表示させてみると、確実に終了したことを確認できるはずだ。
killコマンドで強制終了を試みてもプロセスが一向に終了する気配がないという場合、カーネルのなかで問題が発生している可能性がある。その場合、いくらkillコマンドを実行してもどうにもならないことが多い。タイムアウトのある処理であれば戻ってくる可能性もあるが、そのままどうにもならない場合にはリセットスイッチ的な仕組みでシステムを強制再起動することになるだろう。
このほかの用途では、サーバなどに設定ファイルの再読み込みをさせるといった目的でkillコマンドが使われることもある。対応しているサーバに限定されるが、killコマンドで設定ファイルの再読み込みを実施させるシグナルをサーバプロセスに送信することができる。
ただし現在、そうした目的ではserviceコマンドやsystemctlコマンドを使うのが一般的だ。直接killコマンドを実行して設定ファイルの再読み込みを行わせることは少ないと思うが、そういったことができるということは知っておいていただきたい。