プロセス・サービス系

【Linuxの基礎知識】kill / killall / timeoutの違いと正しい使い分け

Linuxで作業していると、動かしているプログラムが止まらなくなったり、いつまでも処理が終わらないなんて場面に出くわすことはありませんか。

そんな時に思い浮かぶのが「kill」「killall」「timeout」というコマンドです。

でも、この3つって名前が似ていて、どれをどう使い分ければいいのか意外と迷いやすいんですよね。

PIDを直接指定して終了させるのか、プロセス名でまとめて対象にするのか、それとも実行時間に制限をかけて自動で止めるのか…。

正しい使い方を知らないまま使うと、止めなくていいサービスまで落としてしまったり、逆に全然効いていなかったりすることもあります。

この記事では、そんな「kill」「killall」「timeout」の違いを整理しながら、実際の運用でどう選んでいけばいいのかをわかりやすくまとめていきます。

kill/killall/timeoutとは

Linuxで動作するプログラムが応答しなくなった場合や制御が必要な場合に便利なのが、プロセスを終了または制御するコマンドです。

その代表的なものが「kill」「killall」「timeout」です。いずれも似た目的で利用されますが、指定の仕方や用途が異なるため、正しく理解して使い分けることが大切です。

基本概要と役割の違い

killは特定のプロセスID(PID)を指定してシグナルを送るコマンドです。

これにより対象プロセスを終了させたり、特定の動作を指示したりできます。killallはプロセス名を指定して一括で終了させることができるコマンドです。同名のプロセスが複数動いている場合に有効です。

timeoutは指定した時間だけコマンドを実行し、その時間が経過したら自動的に終了させるためのコマンドです。長時間動作する可能性がある処理を制御する際に便利です。

取得できる情報や利用シーン

killはPIDを通じてプロセスの状態を直接操作します。

そのため対象が明確なときに利用されます。 killallは対象のプロセス名からまとめて処理できるため、複数の同一プロセスを一括で終了したい場合に有効です。

timeoutは一定時間で処理を強制終了できるため、停止しないコマンドの暴走を防ぐ運用で役立ちます。

他ツールと比較したメリット

killは最も基本的で確実な制御が可能です。

プロセスの挙動を細かく制御したい場面に向いています。 killallはプロセス名で簡潔に指定できるため、PIDを調べる手間が省けます。管理作業の効率化に有効です。

timeoutは時間制御ができるため、シェルスクリプトやバッチ処理で安全性を高められます。これにより、意図せず長時間リソースを消費し続けるリスクを回避できます。

代表的なシグナル一覧

Linuxで利用されるシグナルには多くの種類がありますが、プロセス制御でよく使われるものは限られています。

ここでは代表的なシグナルを整理します。

番号名前概要
2SIGINT割り込み要求。Ctrl+Cで送信され、通常はプロセスを終了させます。
9SIGKILL強制終了。捕捉不可で確実に停止しますが、後処理は実行されません。
15SIGTERM終了要求。デフォルトでkillが送信するシグナルで、プロセスはtrapで処理できます。
18SIGCONT一時停止中のプロセスを再開します。
19SIGSTOPプロセスを一時停止させます。捕捉不可です。

kill/killall/timeoutの導入手順

Linux環境ではプロセス管理コマンドが標準で用意されていることが多いですが、ディストリビューションによって導入状況が異なる場合があります。ここでは、kill・killall・timeoutの導入可否と基本的な呼び出し方について解説します。

パッケージの有無と標準搭載状況

killはLinux標準のprocpsパッケージに含まれており、ほとんどの環境で追加インストールの必要はありません。killallは同じくprocps-ngパッケージに含まれますが、ディストリビューションによっては別途インストールが必要な場合があります。

timeoutはGNU coreutilsに含まれており、こちらも多くの環境で標準提供されています。代表的なRHEL系ディストリビューションでは以下のように確認やインストールが可能です。

rpm -q procps-ng coreutils

出力例:

[root@dev01 ~]# rpm -q procps-ng coreutils
procps-ng-3.3.17-14.el9.x86_64
coreutils-8.32-39.el9.x86_64

もしインストールされていない場合は、以下のように導入できます。

sudo dnf install procps-ng coreutils

基本的な呼び出し方

killコマンドはプロセスIDを指定してシグナルを送ります。最も基本的な終了操作は以下の通りです。

kill -9 1234

killallはプロセス名を指定して複数のプロセスをまとめて終了させます。

killall httpd

timeoutは指定した秒数でコマンドを実行し、時間が経過したら強制終了させます。

timeout 30s ./long_script.sh

このように、各コマンドは導入の手間が少なく、すぐに利用できる環境が整っています。運用に合わせて正しく呼び出し方を覚えておくことが大切です。

kill/killall/timeoutの基本的な使い方

kill・killall・timeoutはどれもプロセスを制御するためのコマンドですが、指定方法やオプションによって挙動が異なります。ここでは基本的な使い方を整理し、代表的なオプションや利用例を紹介します。

各コマンドで利用頻度の高いオプションをまとめると以下の通りです。

コマンドオプション概要
kill-9強制終了(SIGKILL)
kill-15通常終了(SIGTERM、デフォルト)
killall-9指定したプロセス名を強制終了
killall-u ユーザー名指定ユーザーのプロセスを終了
timeout--preserve-status終了時に元の終了コードを保持
timeout--kill-after=秒数SIGTERM後に強制終了を行うまでの猶予時間

killの基本操作(PID指定)

killはプロセスID(PID)を指定して終了シグナルを送ります。対象プロセスが明確に分かっている場合に有効です。

下記はhttpdプロセスを強制停止している例です。

ps aux | grep httpd

出力例:

root 1023 0.0 0.2 225184 5400 ? Ss 09:12 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1045 0.1 1.2 465320 25360 ? S 09:12 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1046 0.1 1.1 464200 23120 ? S 09:12 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1047 0.1 1.1 464200 23120 ? S 09:12 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1048 0.1 1.1 464200 23120 ? S 09:12 0:00 /usr/sbin/httpd -DFOREGROUND
bepro 1099 0.0 0.0 12144 980 pts/0 S+ 09:13 0:00 grep --color=auto httpd

このように、httpd プロセスが複数立ち上がっている場合は、rootがマスター(親プロセス)、apacheユーザーがワーカー(子プロセス)として表示されます。最後の grep httpd 自体のプロセスもリストに含まれるのが特徴です。

kill -9 1023

この例では、まずpsコマンドでPIDを確認し、そのPIDに対して強制終了シグナルを送っています。

SIGKILLはカーネルが直接プロセスを終了させるため、trapなどで捕捉することはできません。必ず停止させられますが、リソースの解放やログの書き込みなどが行われないまま終了するため、必要以上に多用すべきではありません。

killallの基本操作(プロセス名指定)

killallはプロセス名を指定するだけで同名のプロセスを一括終了できます。複数のプロセスが同じ名前で動いている場合に効率的です。

下記はhttpdプロセスをまとめて強制停止している例です。

ps aux | grep httpd

出力例:

root 1023 0.0 0.2 225184 5400 ? Ss 09:12 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1045 0.1 1.2 465320 25360 ? S 09:12 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1046 0.1 1.1 464200 23120 ? S 09:12 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1047 0.1 1.1 464200 23120 ? S 09:12 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1048 0.1 1.1 464200 23120 ? S 09:12 0:00 /usr/sbin/httpd -DFOREGROUND
bepro 1099 0.0 0.0 12144 980 pts/0 S+ 09:13 0:00 grep --color=auto httpd

この例では、httpdという名前の全てのプロセスを強制終了します。PIDを調べる手間が不要な点がメリットです。

killall -9 httpd

Linux環境ではプロセスを終了させる方法として「killall」と「systemctl」の両方が利用されます。しかし、この二つは似ているようで仕組みが大きく異なります。特に「プロセス名」と「Unit名」の違いを理解しておくことが重要です。

プロセス名とUnit名の違い

killallは実際に動いているプロセスの名前に対してシグナルを送ります。一方、systemctlはsystemdの仕組みに基づき、サービス全体を管理するUnit名を対象に操作を行います。両者の対象の違いを整理すると以下のようになります。

操作方法対象指定例
killallプロセス名(実行ファイル名)killall httpd
systemctlUnit名(systemd管理のサービス名)systemctl stop httpd.service

使い分けの考え方

サービス全体を安全に停止・再起動したい場合は、systemctlを利用するのが推奨されます。systemdが依存関係やログ管理を含めて制御してくれるため、意図しないトラブルを避けやすくなります。

一方、killallはあくまでプロセスを直接終了させたい場合に有効です。PIDを調べる手間を省き、同名のプロセスを一括で終了できる点が特徴です。ただし、systemdの管理を経由しないため、依存関係やサービス再起動などは自動的には行われません。

Apache HTTP Serverを停止する場合を比較すると次のようになります。


実際の例

  • systemctl stop httpd
    → systemdがUnitとして管理しているhttpd.serviceを停止します。ログや依存関係も正しく処理されます。

  • killall httpd
    →実際に稼働中のhttpdプロセスを強制終了します。systemdには通知されないため、自動的に再起動される設定が有効になっている場合はすぐに再生成されることもあります。

timeoutの基本操作(制限時間指定)

timeoutは指定した時間だけコマンドを実行し、経過後に自動的に終了させます。無限ループや長時間実行の抑制に便利です。

timeout 60s ./script.sh

この例では、script.shを60秒間だけ実行し、時間を過ぎたら強制終了します。追加オプションを併用することで、強制終了前に猶予を設けることも可能です。

応用的な活用方法

kill・killall・timeoutは基本的なプロセス制御に利用するだけでなく、工夫することでより柔軟な運用が可能です。

ここでは条件付きの終了や長時間処理の制御、他コマンドと組み合わせた運用方法について解説します。

条件付きのプロセス終了

プロセスを無条件に終了させるのではなく、特定の条件を満たした場合にのみ終了させたいことがあります。

例えば特定のユーザーが実行しているプロセスだけを対象にする場合はkillallにユーザー指定オプションを加えます。

killall -u apache httpd

この例ではapacheユーザーが実行しているhttpdプロセスだけを終了します。

意図しないユーザーのプロセスに影響を与えないため、環境を選んで利用する際に有効です。

長時間処理の制御と自動停止

処理が長時間継続し、システム資源を圧迫することを避けたい場合にはtimeoutを活用します。

指定した時間を超えると自動的に終了させられるため、無限ループや異常停止の防止に役立ちます。

timeout 300s ./backup.sh

この例ではbackup.shを300秒間実行し、制限時間を過ぎた時点で自動的に終了します。

さらに--kill-afterオプションを組み合わせることで、通常終了が効かない場合に一定時間後に強制終了することも可能です。

他コマンドとの組み合わせによる運用

kill・killall・timeoutは他のLinuxコマンドと組み合わせることでより効率的な運用が可能になります。

例えばpsと組み合わせて条件に合致するプロセスだけを終了したり、シェルスクリプトに組み込んで自動運用を行うことができます。

ps aux | grep httpd | awk '{print $2}' | xargs kill -9

この例ではhttpdという名前を含むプロセスを検索し、そのPIDを抽出して一括終了しています。

スクリプトに組み込むことで障害時の自動復旧処理などにも応用できます。

実践的な活用例

kill・killall・timeoutは基本操作だけでなく、実際のシステム運用で役立つ具体的な場面があります。ここではサービス管理やトラブルシュート、さらにスクリプトへの応用例を紹介します。

サービス停止や再起動の手順

サービスを終了する場合、まずはsystemctlで安全に停止するのが基本です。しかし緊急時やsystemdの制御が効かない場合には、killやkillallを直接利用することもあります。

systemctl stop httpd

上記のようにsystemctlで停止できないときは、killallでプロセス名を指定して直接終了させます。再起動を行う場合はsystemctlを優先する方が依存関係も含めて正しく処理されます。

killall httpd

ハングアップしたプロセスの切り分け

アプリケーションがハングアップして応答しない場合、まずpsコマンドやtopコマンドで対象のPIDや状態を確認します。その上でkill -15で終了を依頼し、反応がない場合に限ってkill -9を利用します。

ps aux | grep myapp

出力例:

bepro 21567 5.2 1.8 421320 37520 ? Sl 10:45 0:15 /usr/local/bin/myapp --config /etc/myapp.conf
bepro 21589 0.0 0.0 12144 980 pts/0 S+ 10:46 0:00 grep --color=auto myapp

  • 1行目は実際に稼働している myapp プロセスです。ユーザーは bepro、PIDは 21567 です。
  • 2行目は検索コマンド grep myapp 自身のプロセスが表示されています。これは実際に終了対象には含めません。

この例ではPID 21567のプロセスに対して通常終了シグナル(SIGTERM)を送っています。

kill -15 21567

どうしても終了しない場合は強制終了シグナル(SIGKILL)を送ります。

kill -9 21567

このように段階を踏むことで、リソースの解放やログ出力を残したまま安全に停止できる可能性が高まります。強制終了は最後の手段として扱うことが推奨されます。

シェルスクリプトでの利用例

kill・killall・timeoutはシェルスクリプトに組み込むことで自動運用に活用できます。例えば長時間動作する可能性がある処理にtimeoutを付与し、制御不能状態を回避できます。

#!/bin/bash timeout 600s /usr/local/bin/data_sync.sh || echo "処理が制限時間を超えました"

また、定期的に特定のプロセスを監視し、異常時に強制終了と再起動を行う仕組みを作成することも可能です。これにより人手を介さず安定したサービス運用が実現できます。

利用時の注意点

kill・killall・timeoutは便利なコマンドですが、使い方を誤るとシステム全体に影響を与える可能性があります。

特にサーバー運用の現場では、慎重に利用することが求められます。ここでは代表的な注意点を解説します。

シグナル送信時の影響とリスク

killコマンドで送るシグナルには複数の種類があり、それぞれ挙動が異なります。

一般的に利用されるSIGTERM(-15)はアプリケーションに「終了してほしい」という要求を送り、プロセス側がtrapを利用して後処理を実行できます。

一方でSIGKILL(-9)は強制終了であり、プロセスは一切の処理を行えないまま終了します。そのため一時ファイルやロックファイルが残り、リソースの解放が不完全になるリスクがあります。

誤ったプロセス終了による障害

PIDやプロセス名を誤って指定すると、システムに必要なサービスまで停止してしまう恐れがあります。

特にkillallは同名の全プロセスに影響を与えるため注意が必要です。例えば「killall sshd」を誤って実行するとリモート接続が切断され、サーバー管理自体が困難になります。

誤操作を防ぐためにはpsコマンドなどで対象プロセスを確認し、終了対象が正しいかを必ず確認してから実行することが大切です。

ログ監視やリソース負荷の確認

プロセスを強制終了した場合、その原因が明確でなければ同じ問題が再発する可能性があります。

killやtimeoutを使って処理を止めた後は、システムログやアプリケーションログを確認し、根本原因を特定することが必要です。また強制終了を多用するとシステム資源が適切に解放されない場合があり、CPUやメモリ、ディスクI/Oへの負荷が蓄積する可能性があります。

運用では監視ツールと組み合わせてリソース状況を把握しながら、安全に利用することが求められます。

まとめ

kill・killall・timeoutはLinuxにおけるプロセス管理に欠かせない基本的なコマンドです。いずれもプロセスの制御を目的としていますが、指定方法や適用範囲が異なるため、正しく使い分けることが重要です。

killはPIDを指定して確実に対象プロセスへシグナルを送れるため、個別制御に適しています。killallはプロセス名を指定することで一括終了が可能となり、効率的に複数プロセスを処理できます。timeoutは指定時間で自動的に終了できるため、長時間処理や暴走対策に役立ちます。

ただし、SIGKILLによる強制終了はtrap処理を回避してリソースを解放しないリスクがあるため、安易に利用すべきではありません。運用ではまずSIGTERMを試み、それでも応答しない場合の最終手段としてSIGKILLを使うことが推奨されます。

また、誤ったプロセスを終了させるとシステムに大きな影響を与える可能性があります。必ずpsやtopなどで対象を確認し、必要に応じてsystemctlによるサービス管理と使い分けることが大切です。

日常的な運用からトラブルシュート、さらには自動化スクリプトまで、これらのコマンドを理解しておくことで安定したシステム管理が実現できます。

次のおすすめ記事

実践環境を整える

ここまで学んだ知識を実際に試すには、Linuxを動かす環境が必要です。手軽に始めるならVPSを利用するのがおすすめです。
VPS徹底比較!ConoHa・さくら・Xserverの選び方



VPSを利用してLinux環境を準備したら、実際の設定は下記の記事が参考になります。
VPSに開発環境を自動構築する方法|Apache+Tomcat+PostgreSQL

よく読まれている記事

1

「私たちが日々利用しているスマートフォンやインターネット、そしてスーパーコンピュータやクラウドサービス――これらの多くがLinuxの力で動いていることをご存じですか? 無料で使えるだけでなく、高い柔軟 ...

2

Linux環境でよく目にする「Vim」という名前。サーバーにログインしたら突然Vimが開いてしまい、「どうやって入力するの?」「保存や終了ができない!」と困った経験をした人も多いのではないでしょうか。 ...

3

ネットワーク技術は現代のITインフラにおいて不可欠な要素となっています。しかし、ネットワークを深く理解するためには、その基本となる「プロトコル」と「レイヤ」の概念をしっかり把握することが重要です。 こ ...

4

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

5

Javaは世界中で広く使われているプログラミング言語であり、特に業務システムやWebアプリケーションの開発において欠かせない存在です。本記事では、初心者向けにJavaの基礎知識を網羅し、環境構築から基 ...

-プロセス・サービス系