Linuxでプロセスを強制終了する方法!top・ps・killコマンドの使い方を徹底解説
Linuxには、プロセスを強制終了(キル)するためのさまざまな方法があります。このチュートリアルでは、動作がおかしくなったプロセスを見つけて終了させる方法を解説します。
プロセスは簡単に「孤児」になってしまうことがあります。意図的であろうとなかろうと、親プロセスがクラッシュすると、子プロセスだけが取り残されて実行され続けることがあります。また、親プロセスが完了した子プロセスを回収(reap)できず、ゾンビプロセスになってしまうケースもあります。
どちらの状態のプロセスも放置されたままでは動けず、手動での介入が必要です。そこで登場するのがジョブコントロールです。それでは、壊れたプロセスを終了させる方法を見ていきましょう。
まずは、いくつかのコマンドを確認します:
- top(および、なぜhtopの方が優れている可能性があるのか)
- ps
- kill
topコマンドでプロセスを検索して終了する
プロセスにkillシグナルを送り始める前に、まずは自分のシステムで何が動いているのかを把握する必要があります。壊れたプロセスが動いているとは限りませんし、何を探せばいいのかもわかりません。そのためにtopがあります。試しにvimを起動して、バックグラウンドに回してみましょう。
vim
これで、通常の操作ができないプロセスが1つできました。次にtopを実行します。通常の出力では情報が多すぎて役に立たないので、フィルタをかけましょう。
- Shift + L を押す
- vim と入力する
- Enter キーを押す
top
これが出力結果です。1行目には稼働時間(uptime)、ユーザー数、ロードアベレージが表示されています。列にも重要な情報が含まれています。日常的に注目すべきは S(ステータス)、%CPU、TIME+ の3つです。プロセスの状態が Z(ゾンビ)なら、killすべきサインです。CPU使用率が100%を超えている場合は暴走している可能性があり、こちらもkillが必要かもしれません。あるいは、数日間も動き続けているプロセスがあれば、再起動のタイミングかもしれません。ただし、それはやや神経質すぎる判断であり、多くの場合は必要ありません。
今回は2行目に注目し、ゾンビを探し、孤児を検索します。この例ではゾンビプロセスは動いていないので、「2 stopped」のプロセスでフィルタリングします。
- o キーを押す
- S=T と入力する
topのフィルタリング
S=T(state=stopped)フィルタで絞り込めたので、あとはkillするだけです。top上で k キーを押し、プロセスの PID を入力してEnterを押します。実行してみるとわかるのですが、終了まで時間がかかることがあります。そんなときは、もう一度 k を押してPIDを入力し、シグナルを 9 に変更してください。
完璧な方法ではありませんが、topをステータスウィンドウとして常時表示していれば、すぐに対応できます。stopシグナルの代わりにkillシグナルを送ることも可能です。
htop
正直に言うと、htopはtopと大差ありません。違うのは色くらいです。
htop
とにかくカラフルです。
psコマンド
ps(process status)は、システム上のプロセス情報を表示するためのネイティブユーティリティです。このツールは /proc ディレクトリ内のファイルを読み取って動作しています。普段よく使うのは次のようなオプションです:
PS
- -a:全ユーザーのプロセスを表示
- -u:プロセスの所有者を表示
- -x:端末に紐付いていないプロセスを表示
ps -aux を単独で実行すると、ありとあらゆるプロセスが表示されますが、それではほとんど役に立ちません。grepにパイプして、迷子になったvimを探しましょう。
ps aux コマンド
見つかりました!ただし、現在実行中のgrepコマンド自体も結果に表示されていることに気づくでしょう。これが不要なら、grepの書き方を少し工夫します。
grepと組み合わせたps auxコマンド
これでOK。vimを探しつつ、vimを探しているgrepプロセス自体は表示しないようにできます。次はいよいよプロセスをkillします。まずkillallを使い、次にkillを試してみましょう。
プロセスの終了方法(killall & kill)
必要な情報は揃いました。プロセス名(vim)とプロセスID(140464)です。killallはプロセス名を、killはプロセスIDを使用します。どちらも同じシグナルを送ることができ、代表的なものは HUP、INT、KILL、TERM、STOP です。詳しく知りたい場合は、kill -l でシグナルの一覧を確認できます。
kill -l コマンド
主要なシグナルを詳しく見てみましょう:
- HUP(シグナル値 1):ハングアップ。電話回線やモデムの時代から残る用語です。多くのシステムでは、デーモンを終了させるのではなく再起動させます。
- INT(シグナル値 2):割り込み(インタラプト)。通常、プロセス操作中にCTRL+Cを押すと送られるシグナルです。「kill -2」でも同じ割り込みシグナルを送れます。
- KILL(シグナル値 9):強制終了。通常これが目的のシグナルです。PIDを即座に強制終了させます。
- TERM(シグナル値 15):終了(terminate)。プロセスが正常に終了するときの標準的な挙動です。プロセスに優しくしたいなら、このシグナルでグレースフルに終了させるのが正解です。killコマンドはデフォルトでシグナル15を送ります。
- STOP(シグナル値 17、19、23):一時停止。大きなディレクトリをコピー中に「一部のフォルダを削除したい」と気づいたら、SIGSTOPで一時停止し、フォルダを削除してからSIGCONTで再開できます。
シグナル値も併記しました。これは各シグナルに割り当てられた数値で、killコマンドでは「SIGHUP」と書く代わりにこの数値を使えます。例えば:
- killall -9 vim
これで、vimという名前のすべてのプロセスを強制終了しようとします。killallを使うときは、実行後にプロセスが確実に終了したかどうかを必ず確認することをおすすめします。
killall -9 vim
もし残りがあれば、kill -9 に続けてプロセスIDを指定して手動で終了させます。例:
- kill -9 140464
まとめ
以上が、プロセスを終了させる方法の簡単な解説です。まずtopで暴走プロセスを特定し、固まったGUIアプリケーションにはkillallを使い、最後にkillで残骸を片付けます。この流れで、ほとんどの問題は解決できるはずです。
迷ったら再起動も一手です。その際は、事前に適切な通知手順を踏むことを忘れずに。さらにシェルコマンドを学んで、Linuxスキルを磨いていきましょう。
-
Linuxでディレクトリ名を変更する方法:mvとrenameコマンドの使い方
このチュートリアルでは、Linuxでディレクトリ名を変更する方法として、「mv」コマンドと「rename」コマンドの2つの使い方を解説します。 ディレクトリ名の変更は、ファイル名の変更とほとんど変わりません。Linuxには「すべてはファイルである」という設計思想があり、ディレクトリも例外なくファイルとして扱われます。そのため、ファイルのリネームで使うテクニックの多くが、そのままディレクトリにも応用できます。 mvコマンドでディレクトリ名を変更する mv RenameDir/ renameDir mvコマンドによるディレクトリ名の変更 方法はこれだけです。シンプルにmvするだけで完了します。ただ
-
Linuxで応答しないアプリを強制終了する方法まとめ【GUI・コマンド両対応】
Linuxは堅牢なオペレーティングシステムとして知られており、アプリケーションのフリーズや動作の遅延といったトラブルは比較的少ないです。それでも、まれにアプリケーションが応答しなくなることがあります。そんなときは、復旧を待つだけでなく、フリーズしたアプリを強制終了して問題を解決できます。本記事では、応答しないアプリケーションを終了させるための実用的な方法をいくつか紹介します。状況に応じて最適な方法を選べるよう、GUI操作からコマンドラインまで幅広く解説していきます。注意: 本記事ではKali Linuxを使用していますが、紹介する方法は他の多くのLinuxディストリビューションでも同様に利用可