舞台裏
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回全滅したタブと引き換えに、この体に染みついた習慣が手に入ったのなら、そう悪い取引でもなかったと思います。
あわせて読みたい
- 子どものころに見た「虫を運ぶアリ」を、20ステージのゲームにしました
Crumb Colony 第6章「草むらのごちそう」は、アリが実際に運ぶ虫20種のステージです。カギになる箱は奥深くに埋もれていて推理だけでは解けませんが、どのステージもアイテムなしでクリアできることを保証しています。
- 10万ダウンロード超えの古いアプリ、2年ほど放置していたのに13日間のリニューアルで再び売れ始めました
Google Playで10万以上ダウンロードされながら1〜2年まともな更新がなかったPomodoro Diary。13日間で53件のPRをマージして作り直したところ、9月末から再び注文が入り始めました。
- アリたちがドット絵をひと口ずつ巣へ運ぶ、小さなゲームを作りました
Crumb Colony は、同じ色のアリを放ってドット絵をひと口ずつ巣へ運ばせる、ブラウザで遊べるパズルゲームです。ドット絵の料理が20皿、どのステージも解けることを確認済みです。
