CodeGym /コース /Docker SELF /プロセス終了: コマンド `kill`, `killall`, `pkill`

プロセス終了: コマンド `kill`, `killall`, `pkill`

Docker SELF
レベル 2 , レッスン 5
使用可能

プロセス終了: コマンド kill, killall, pkill

1. プロセスの終了

今日はさらに一歩進んで、効率的にプロセスを終了させるコマンドを学びます。準備してね、"フリーズした"プログラムにイライラする日々はもうすぐ終わりだよ!

Linuxで実行中のアプリケーションやコマンドはすべてプロセスなんだ。でも、プログラムがフリーズしたり、CPUリソースを100%使い果たしたり、動作がおかしくなったらどうする?管理者(または開発者)の役割は介入して"反乱"プロセスを終了させることだね。Linuxにはこのためのツールがいっぱいあるよ: kill, killall, そして pkill。怖そうな名前だけど、何も壊すために来たわけじゃないから安心して。むしろ、これらはきれいに整理整頓するためのエレガントな方法だよ。


2. コマンド kill

基本

killコマンドは、プロセスの識別子 (PID) を使ってプロセスを終了させるコマンドだよ。PIDはシステムが各プロセスに割り当てる一意の番号のこと。例えば、PIDが1234のプロセスを終了させたい場合、次のコマンドを使用するんだ:

kill 1234

Linuxは基本的にかなりフレンドリーなOSなので、killコマンドはプロセスに「終了しろ」って命令じゃなくて、「終了してね」ってリクエストを送るんだ。このリクエストは「シグナル」と呼ばれてて、デフォルトではSIGTERM(15)というシグナルを送るよ。

シグナルって何?

Linuxではプロセスとやり取りするためにシグナルを使うよ。これは、いろいろな意図を込めたポストカードを送るような感じかな:

  • SIGTERM (15): 「お願いだから終了してね」。プロセスに実行を終えるように丁寧に頼むシグナルだよ。
  • SIGKILL (9): 「もう我慢の限界だ!お前クビ!」プロセスを強制終了するためのシグナル。
  • SIGHUP (1): 「ちょっと設定をリロードしてくれよ」。止めずにプロセスを再起動するために使われる。

プロセスを強制終了する例を見てみよう:

kill -9 1234

SIGTERMでプロセスが終了しない場合、もっと強いシグナルであるSIGKILLを送ることができるよ。

どうやってプロセスのPIDを探すの?

killコマンドを使うには、プロセスのPIDを知る必要があるんだ。ここで便利なのが、pstop、またはhtopといったコマンドたち。例えば、ps auxを実行すると、すべての実行中のプロセスが表示される:

ps aux | grep firefox

このコマンドを実行すると、Firefoxプロセスを見つけて、そのPIDを表示してくれるよ。

プロセスが終了すれば一安心。でも、「フリーズしてる」プロセスがいくつもある場合はどうする?そんな時にはkillallpkillコマンドの出番だね。


3. コマンド killall

一括終了の便利さ

killallコマンドを使うと、特定の名前を持つ全てのプロセスを終了させることができるよ。PIDを手動で探す必要がなくて、めっちゃ簡単に実行できる。例えば、全てのFirefoxインスタンスを閉じたい場合:

killall firefox

killコマンドと同様に、killallもプロセスに信号を送信することができる。そして特定の信号を指定することも可能だよ:

killall -9 firefox

便利なアドバイス

killallのようなコマンドを使うときは注意してね。間違って汎用的すぎるプロセスを指定してしまうと、例えばkillall pythonと入力した場合、実行中のPythonアプリケーション全て、例えばサーバータスクや重要なスクリプトも終了させちゃうことになるから。

どんな信号がサポートされているの?

killkillallpkillの全てのコマンドに対応する信号のリストを確認するには、このコマンドを使ってみてね:

kill -l

4. コマンドpkill

名前(またはその一部)でプロセスを検索

pkillコマンドはkillallと似ていますが、もっと柔軟です。特定のパターンに一致するプロセスを終了させることができます。例えば:

pkill fire

このコマンドは、名前に「fire」を含む全てのプロセスを終了します。プロセス名が長かったり、一部しか分からない時に便利です。

ユーザーのプロセスを終了する

特定のユーザーが所有するプロセスを終了することができます。例えば:

pkill -u username

このコマンドは、ユーザーusernameが所有する全てのプロセスを終了します。

killkillallpkillの比較

コマンド 特徴
kill PIDでプロセスを終了する。ターゲットを絞った処理。
killall 指定された名前の全てのプロセスを終了。大量のプロセスを一気に閉じる時に便利。
pkill 名前またはパターンでプロセスを終了する。ユーザー名などの追加パラメータに対応。

5. 実践: プロセスを終了する

今まで学んだことを実際に試してみよう。まず、いくつか長時間実行のプロセスを開始するよ:

sleep 300 &
sleep 400 &
sleep 500 &

これらのコマンドで異なる待機時間のバックグラウンドプロセスが3つ作られるよ。これで、kill, killall, pkillのコマンドを試す準備ができたね。

  1. コマンドpsを使って実行中のすべてのsleepプロセスを確認:
ps aux | grep sleep

各プロセスのPIDが表示されるよ。

  1. 例えば、PIDが1234のプロセスを終了してみよう:
kill 1234
  1. sleepのプロセスを全部まとめて終了する:
killall sleep
  1. もう一度いくつかsleepプロセスを開始して、pkillを使って終了:
pkill sl

6. よくあるミスと重要なポイント

他のユーザーのプロセスのように、権限がないプロセスを終了しようとすると、コマンドはエラーを返します。この場合、スーパーユーザーの特権(sudo)が必要です。例えば:

sudo kill 1234

もう一つ混乱の原因となるのは、あまりにも攻撃的なシグナル-9の使用です。これはコンピュータの電源コードを抜くのに相当します: システムはリソースを解放したりデータを保存したりする時間がありません。SIGKILLは本当に必要な場合のみに使用してください。

特にサーバーを管理している場合は、killallpkillの使用には注意が必要です。「手探り」でプロセスを終了することは、重要なデータを失う可能性があります。


なぜプロセス終了コマンドを知ることが重要なのか?

これらのコマンドは、ハングアップしたアプリケーションの終了からサーバープロセスの管理まで、幅広い用途があります。採用面接では、killpkillの知識が、特にシステム管理やバックエンド作業に携わる際のあなたの能力の指標となることがあります。

これらの知識を活用して、制御不能なプロセスを自動的に終了させたり、使用中のポートを解放したりするスクリプトを作成してみてください。例えば、ポート8080を占有しているサーバーを起動する前に次のようにします:

pkill -f "port 8080"

これらのコマンドの柔軟性と強力さは、Linuxスペシャリストには欠かせないツールとなります。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION