舞台裏

AIに開発サーバーを止めてもらったら、ブラウザまで全部落とされました。しかも2回

POMODIARY チーム · · 4 分で読めます

9月14日、Chrome のタブがすべて同時にクラッシュしました。

Claude のデスクトップアプリも、ChatGPT も、Obsidian も同じで、まったく同じ瞬間に真っ白になりました。

数秒ほど画面を見つめたまま固まって、そこで気づきました。この光景には見覚えがある、と。1週間前の9月7日、まったく同じことが起きていたのです。

この記事はもともと中国語で、私の WeChat 公式アカウント(チャットアプリ WeChat 内のブログのような発信チャネル)向けに書いたものを、日本語の読者向けに編集したものです。

犯人は、いかにも慎重そうな1行のコマンド

2回とも、きっかけは同じでした。AI にローカルの Next.js 開発サーバーを止めてもらったところ、AI はこんな1行を実行しました。

pkill -f "next-server" -U "$(id -u)"

このコマンドだけを見ると、むしろ気が利いているようにさえ思えます。-f でコマンドライン全体から next-server にマッチさせ、さらに -U で「現在のユーザーのプロセスだけ」に絞る。二重の安全策です。

問題は、まさにこの「二重の安全策」にありました。

macOS の pkill は引数を並べ替えてくれない

Linux の pkill は GNU getopt を使っています。引数をどんな順番で書いても、オプションはオプション、パターンはパターンと自動で整理してくれます。

一方、macOS の pkill は BSD getopt を使っています。オプションではない最初の引数に出会った時点で解析をやめ、それ以降はすべてパターンとして扱います。しかも pkill は複数のパターンを同時に受け付け、どれか1つにでもマッチすれば対象になります。

つまり macOS から見ると、このコマンドには3つのパターンが含まれていたことになります。

  • next-server
  • -U
  • 501(私のユーザー ID)

さらに -f はコマンドライン全体に対してマッチさせるので、このコマンドの本当の意味は「コマンドラインに -U か 501 を含むプロセスをすべて終了させる」になってしまいました。

Chrome、Claude、ChatGPT、Obsidian のような Chromium や Electron ベースのアプリは、タブやウィンドウの1つひとつの裏で大量の Helper プロセスが動いていて、起動引数も長くて雑多です。マッチするのはあっという間でした。コマンド1行で全滅です。

安全策を1枚足したつもりが、その安全策そのものが爆弾になっていました。

その後どう変えたか

1つ目は、開発サーバーはポート番号で探して止めること。名前で当てずっぽうに探さないことです。

lsof -ti :3000 -sTCP:LISTEN | xargs kill

そのポートで待ち受けているプロセスだけを終了させるので、巻き添えは起きません。

2つ目は、どうしても pkill を使うなら、オプションはすべてパターンより前に書き、パターンはポート番号やパスまで具体的にすることです。 実行する前に、同じ引数で pgrep を使ってプレビューします。

pgrep -fl "next start -p 3011"
pkill -f "next start -p 3011"

何にマッチするかを先に確かめてから実行します。

3つ目は、私がいちばん大事だと思っていることです。ルールとして書くだけで終わらせず、フックにすることです。

ルールはお願い、フックは保証

同じ落とし穴に2回はまりました。いまでは、Claude Code に渡しているグローバルルールファイル CLAUDE.md に、プロセスの止め方だけを扱う節があり、事故が起きた9月7日と9月14日の日付も書き込んであります。

2回目のあと、私は「覚えておいてもらう」ことに期待するのをやめました。Claude Code の PreToolUse フックを使って、200行ちょっとの Python スクリプトを書きました。AI が Bash コマンドを実行する前に毎回チェックを通し、pkill や pgrep でオプションがパターンの後ろに書かれていれば、その場でブロックして実行させません。

この一件で、ある違いがはっきりわかりました。

プロンプトやルールファイルに書いたことは、AI にとっては「お願い」です。たいていは守ってくれますが、コンテキストが長くなったり作業が急ぎになったりすると、抜け落ちる可能性があります。

フックに書いたことは「保証」です。AI が覚えているか、理解しているかには左右されません。コマンドがそもそもシェルに届かないのです。

チームのマネジメントも同じ理屈です。大事なことは「みなさん気をつけてください」に頼らず、プロセスで止めるべきです。CI で止められるものはコードレビューに頼らない。権限で止められるものは各自の心がけに頼らない。

AI に自分のパソコンで直接コマンドを実行させるのは、いまや日常になりました。AI のミスが人間よりひどいとは限りませんが、ミスをするスピードは人間よりずっと速いです。AI にルールを決めるのと同時に、ガードレールも忘れずに設置しておきましょう。

私はというと、いまでは pkill を見るたびに、反射的に引数の順番を確認するようになりました。

2回全滅したタブと引き換えに、この体に染みついた習慣が手に入ったのなら、そう悪い取引でもなかったと思います。

あわせて読みたい