killall php コマンド情報まとめ
ターミナルの killall php コマンドについて、オプション情報、kill・pkill との違い、AIエージェントが実行した場合の危険性を紹介しています。
killall php とは
killall php(kill all processes named php)は、プロセス名 php に一致する実行中のプロセスをすべて強制終了するコマンドです。
killall コマンドはプロセス名を引数に取り、その名前を持つすべてのプロセスにシグナルを送信します。
デフォルトのシグナルは SIGTERM(終了要求)で、-9 オプションを付けると SIGKILL(強制終了)になります。
PHPプロセスが応答しなくなった際や、スクリプトが暴走している場合の緊急停止手段として使われますが、名前が一致するプロセスをすべてまとめて停止するため、意図しないプロセスを巻き込むリスクがあります。
主なオプション
| オプション | 意味 |
|---|---|
-9(または -KILL) | SIGKILL シグナルを送り、プロセスを即時強制終了する。プロセス側での後処理(ファイル保存・クリーンアップ)は行われない |
-15(または -TERM) | SIGTERM シグナルを送る(デフォルト)。プロセスにシャットダウンの機会を与えるが、無視される場合もある |
-s シグナル | 送信するシグナルを名前で指定する(例:-s HUP で設定リロード) |
-u ユーザー名 | 指定したユーザーが所有するプロセスのみを対象にする |
-v | シグナルを送ったプロセスの情報を表示する(verbose) |
-i | 各プロセスを終了する前に確認を求める(interactive) |
オプションを省略した killall php は SIGTERM を送ります。プロセスが応答しない場合は -9 で強制終了しますが、後処理が行われないためセッションの破損やキャッシュの不整合が生じる可能性があります。
本番環境では可能なかぎり SIGTERM を試してから SIGKILL に切り替える手順を取ってください。
よく使う組み合わせ
終了前に対象プロセスを確認する
# 終了前に pgrep で対象プロセスを確認する
pgrep -la php
# 確認後に killall を実行
killall php
pgrep -la php でプロセスID・コマンドラインを一覧表示してから killall を実行する手順が安全です。予期しないプロセス(CLI スクリプト、cron ジョブなど)が含まれていないかを事前に確認できます。
特定ユーザーの PHP プロセスのみ停止する
# www-data ユーザーの php プロセスのみ終了
killall -u www-data php
# 確認プロンプト付きで実行
killall -i -u www-data php
-u オプションで対象を特定ユーザーに絞ることで、他ユーザーが実行している PHP プロセスを誤って停止するリスクを減らせます。-i を加えるとプロセスごとに確認プロンプトが表示されるため、さらに安全です。
応答しない PHP プロセスを強制終了する
# まず SIGTERM で終了を試みる
killall php
# 数秒待って残存プロセスを確認
sleep 3 && pgrep -la php
# まだ残っていれば SIGKILL で強制終了
killall -9 php
SIGTERM → 確認 → SIGKILL の順で実行するのがベストプラクティスです。-9 は最終手段として位置付け、いきなり使用しないようにしてください。
killall と kill・pkill の違い
どちらもプロセスへシグナルを送る手段ですが、対象の指定方法と影響範囲が大きく異なります。
| 項目 | killall php | kill <PID> | pkill php |
|---|---|---|---|
| 対象の指定 | プロセス名(完全一致) | プロセスID(PID) | プロセス名(部分一致・正規表現) |
| 影響範囲 | 同名のプロセスすべて | 指定した1プロセスのみ | パターンにマッチするプロセスすべて |
| 誤爆リスク | 中(同名プロセスを全停止) | 低(PID で1つに絞れる) | 高(部分一致で広い範囲に当たる) |
| ユーザー絞り込み | ○(-u オプション) | ×(PID で一意に特定) | ○(-u オプション) |
| macOS での動作 | ○(標準搭載) | ○(標準搭載) | ○(標準搭載) |
特定の1プロセスだけを停止したい場合は kill <PID> が最も安全です。ps aux | grep php や pgrep php でPIDを確認してから実行してください。
pkill は部分一致するため php と指定すると php-fpm や php8.2 などの関連プロセスも対象になる点に注意が必要です。
ユースケース
暴走した PHP スクリプトを緊急停止する
# CPU を大量消費しているプロセスを特定
top -b -n 1 | grep php
# 問題のある PHP プロセスを PID で個別停止(推奨)
kill -9
# 複数プロセスが暴走している場合のみ killall を使う
killall -9 php
まず top や ps で問題のあるプロセスを特定し、可能であれば kill <PID> で個別停止するのが原則です。複数の PHP プロセスが同時に暴走している場合に限り killall を使う判断をしてください。
PHP-FPM の再起動前にプロセスをクリアする
# systemctl で正規の方法でリロード(推奨)
sudo systemctl reload php8.2-fpm
# 残存プロセスがある場合のクリア
sudo killall -u www-data php-fpm8.2
# 状態確認
sudo systemctl status php8.2-fpm
PHP-FPM の再起動は systemctl reload または systemctl restart が正規の手順です。
killall は systemd の管理外でプロセスを停止するため、systemctl がプロセスを補足できなくなる場合があります。killall を使った後は必ず systemctl status で状態を確認してください。
AIエージェントが実行しようとした場合
AIエージェントの目的
AIエージェントは主に次のような目的で killall php を実行しようとすることがあります。
- PHP プロセスが応答しなくなったと判断し、サービスを回復させるために実行しようとすることがあります
- 設定変更やデプロイ処理の一環として、既存の PHP プロセスをまとめてリセットしようとすることがあります
- エラーループに陥った PHP スクリプトを停止するために、原因プロセスの特定を省略して一括終了しようとすることがあります
危険性
killall php コマンドは、名前が php に一致するプロセスをシステム全体でまとめて強制終了する不可逆的な操作です。
WordPressなどの複数サイトを同一サーバーで運用している環境では、関係のないサイトの PHP プロセスも巻き込んでサービス停止を引き起こします。
また、systemd や supervisor の管理外でプロセスを落とすと、サービスの自動復旧が想定通りに動作しない場合があります。AIエージェントが自動実行することは推奨されません。
人間による対象プロセスの確認(pgrep -la php)と、systemctl 経由での正規手順を検討した上で実行の判断を行うべきです。エージェント設定でのブロックリスト登録も検討してください。