
無言で失敗するバッチの診断|終了コード0なのに何もしていない原因を出す
終了コード 0 は「成功した」という意味ではありません
0 が意味するのは「プロセスが最後まで到達した」ことだけです。
途中で例外が起きていても、それを黙って捨てる書き方をしていれば、プロセスは最後まで到達します。ログには「完了」と出て、終了コードは 0 で、成果物だけが1つも増えていない。この状態には手がかりがほとんど残りません。
エラーメッセージが出るものは自分で直せます。厄介なのは、何も言わずに終わるほうです。
検査する9項目
上ほど「自分では気づけない」ものです。
except: passと広すぎる except — 例外は起きている。黙って捨てているのでログにも終了コードにも残らない- 早期 return の握り潰し — 関数の頭で戻っているだけ。呼び出し側は「呼んだ=やった」と見なして完了ログを書く
- 標準出力のバッファリング — 最後に書いたはずの行が失われ、実際より手前で止まったように見える
- ログのローテーション・上書き — 再試行が走った瞬間に失敗時のログが消え、成功した2回目だけが残る
- 終了コード0と処理成功の混同 — 0件処理して0件成功でも
0で終わる - リトライが例外を飲んで静かになる — 回数を使い切っても「終了」としか残らない
- 文字コードエラーだけが握られる — 処理は続いているのに記録だけが欠ける
- サブプロセスの戻り値未確認 — 外部コマンドが失敗しても親は成功として進む
- ログ最終行がどこで途切れたか — 最終行が固定文字列だと、途切れた位置すら嘘になる
返ってくるもの
判定サマリーで、どこまで進んで、どこで消えたかを先に1つ出します。
指摘は重い順に並べ、それぞれに「該当箇所 → なぜ無言になるか → どう確認するか → どう直すか」を付けます。確認と修正はそのまま貼れる形で返します。
再発させないための作り方も返します。握るなら例外の型を名前で指定する、最終行に「何件処理したか」を書く、失敗したら終了コードを非0で終わらせる。無人運用では、終了コードだけが外から見える唯一の信号になります。
確認手順は、コードの見た目ではなく起きた事実の側で見る形にします。出力先そのものを数える、わざと1件失敗させて非0で終わるか見る、2回走らせて2回目のログが1回目を消していないか見る。
症状から引けます
| 症状 | 最初に疑うもの |
|---|---|
| 結果コード0・成果物ゼロ・エラーも無い | 1(広すぎる except) |
| ログに「完了」だけがある | 2(早期return)/5(0の意味) |
| 最後に書いたはずの行が無い | 3(バッファリング) |
| 失敗した日のログだけ見当たらない | 4(ローテーション・上書き) |
| 外部コマンドを呼んだ直後から進んでいない | 8(サブプロセスの戻り値) |
貼るもの
ログの最終行、実行結果コード、スクリプト冒頭の try/except の3つで、いちばん精度が出ます。長い場合は最終行の前後10行で足ります。
ログだけ、コードだけ、症状の説明だけでも受け付けます。情報が足りない時は、何を追加で取ればいいかを先に返します。足りないまま原因を断定することはしません。
正直な限界
- あなたの環境を見に行きません。 判定するのは貼られたテキストだけです。スクリプトを実行することも、ログファイルを開くことも、コードを書き換えることもしません。返すのは「あなたが自分で実行するコマンド」と「書き換えの案」です
- 原因が1つに絞れないことがあります。 無言の失敗は、複数の要因が重なって「何も残らない」状態になっていることがあります。その時は候補を確度の順に並べ、どれを先に確認すれば切り分けられるかを返します。断定はしません
- ログに残っていないものは復元できません。 上書きや未フラッシュで消えた内容は、次回に残すための作りを提案するところまでです
- スクリプト全体の設計レビューではありません。 見るのは「なぜ無言なのか」の一点です。処理内容の正しさ・性能は範囲外です
- 言語・実行基盤で書き方が変わります。 例はPython系を基本にしています。シェル・PowerShell・Node系などは考え方は同じでも確認コマンドと修正の形が変わるため、判断できない場合はその旨を明示します
- 外部サービス側の障害は切り分けの対象外です。 「呼んだ先が落ちていた」ことまでは推定できますが、その先は提供元の状態ページで確認してください
断ること
理由を添えて断ります。エラーを握り潰すための書き方(記録を消す、終了コードを常に0にする、警告を止める)、監視やアラートを回避するための無言化、認証情報をログやコマンドの引数に平文で置く書き方、他人の環境のログを許可の確認なしに前提とする設計、利用規約に反する自動処理を、失敗を隠したまま回し続けるための調整。
