Get started
無言で失敗するバッチの診断|終了コード0なのに何もしていない原因を出す

無言で失敗するバッチの診断|終了コード0なのに何もしていない原因を出す

ログの最終行と実行結果コード、スクリプト冒頭のtry/exceptを貼るだけで、「終了コード0なのに何もしていない」バッチの原因を切り分けます。広すぎるexceptによる例外の握り潰し、早期return、標準出力のバッファリングで消えるログ、ログの上書きで証拠が消える、リトライが例外を飲む、サブプロセスの失敗を拾っていないなど9項目を検査し、そのまま貼れる確認コマンドと次に作る時の書き方を返します。
#Engenharia#Produtividade#Análise
Avaliação
São necessárias mais avaliações
Vendas
0
Como usar
Executar na Capafy
Também em aplicativos externos
Fornecido pelo publisher
Claude Sonnet 5

終了コード 0 は「成功した」という意味ではありません

0 が意味するのは「プロセスが最後まで到達した」ことだけです。

途中で例外が起きていても、それを黙って捨てる書き方をしていれば、プロセスは最後まで到達します。ログには「完了」と出て、終了コードは 0 で、成果物だけが1つも増えていない。この状態には手がかりがほとんど残りません。

エラーメッセージが出るものは自分で直せます。厄介なのは、何も言わずに終わるほうです。

検査する9項目

上ほど「自分では気づけない」ものです。

  1. except: pass と広すぎる except — 例外は起きている。黙って捨てているのでログにも終了コードにも残らない
  2. 早期 return の握り潰し — 関数の頭で戻っているだけ。呼び出し側は「呼んだ=やった」と見なして完了ログを書く
  3. 標準出力のバッファリング — 最後に書いたはずの行が失われ、実際より手前で止まったように見える
  4. ログのローテーション・上書き — 再試行が走った瞬間に失敗時のログが消え、成功した2回目だけが残る
  5. 終了コード0と処理成功の混同 — 0件処理して0件成功でも 0 で終わる
  6. リトライが例外を飲んで静かになる — 回数を使い切っても「終了」としか残らない
  7. 文字コードエラーだけが握られる — 処理は続いているのに記録だけが欠ける
  8. サブプロセスの戻り値未確認 — 外部コマンドが失敗しても親は成功として進む
  9. ログ最終行がどこで途切れたか — 最終行が固定文字列だと、途切れた位置すら嘘になる

返ってくるもの

判定サマリーで、どこまで進んで、どこで消えたかを先に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にする、警告を止める)、監視やアラートを回避するための無言化認証情報をログやコマンドの引数に平文で置く書き方他人の環境のログを許可の確認なしに前提とする設計利用規約に反する自動処理を、失敗を隠したまま回し続けるための調整