バックグラウンド実行する CLI は stdin を /dev/null で明示的に閉じる — 入力待ちの無音ハングを予防する
シェルスクリプト
AIエージェント
CLI
知識
運用
非対話・バックグラウンドで CLI を実行するとき、標準入力をリダイレクトで明示的に閉じないと、stdin から追加入力を読む設計の CLI(AI エージェント CLI のワンショット実行、ssh、ffmpeg など)が入力待ちのまま無音で停止することがある。フォアグラウンドなら「stdin から入力を読んでいます」等のメッセージに気付けるが、バックグラウンドでは出力ゼロのまま時間だけが経過し、発覚が遅れる(実測では発覚まで38分、その間の CPU 消費は1秒未満)。
症状と見分け方
- 出力ファイルが空のまま経過時間だけ伸びる。
- プロセスは生存しているが累積 CPU 時間がほぼゼロ。数十分経過して CPU 消費が1秒未満なら、処理中や API 応答待ちではなく入力待ちを疑う。ps コマンドの累積 CPU 時間表示で確認できる。
予防
- バックグラウンド起動のコマンドには、標準出力・標準エラーの保存先指定に加えて、標準入力を /dev/null から読むリダイレクト指定を常に含める。stdin が即座に EOF を返すため、入力待ちに入る余地がなくなる。read-only で走らせる分には副作用もない。
- 手順書・スキル・ラッパースクリプトに載せるコマンド例に stdin 閉鎖まで書き込んでおく。実行者(人・AI とも)はコマンド例をそのまま使うため、例に含まれていない防御は実行時に抜ける。
適用条件
- 対話入力を本当に受けたいフォアグラウンド実行には適用しない。ヒアドキュメントやパイプで stdin からデータを渡す設計の場合も対象外(その場合は渡すデータで stdin が閉じる)。
- 検知側の基準(プロセス生存と成果物更新の乖離・累積 CPU 時間での判定)と対になる予防側の作法として使う。