0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windowsタスクスケジューラ経由のDiscord Webhookが「たまに届かない」を直した話

0
Posted at

はじめに

Windowsのタスクスケジューラ(schtasks)から定期実行しているPythonスクリプトで、Discord Webhookによる通知を飛ばす仕組みを運用していました。手動で実行するとDiscordに届くのに、タスクスケジューラ経由で実行した場合だけ通知が届かないことがある、という現象に遭遇しました。

本記事では、この「たまに届かない」原因の調査手順と、恒久的な解決策として採用したバッチファイル経由の実行構成を紹介します。同様にタスクスケジューラからPythonスクリプトをバックグラウンド実行している場合の参考になれば幸いです。


発生していた現象

  • タスクスケジューラのタスク実行結果(成功ログ)自体は「正常終了」を示している。
  • にもかかわらず、Discord側にWebhook通知が届かないことがある。
  • 手動でスクリプトを実行すると問題なく届く。

タスク自体はエラーなく終了しているように見えるため、最初は原因の切り分けが難しい状態でした。


調査:schtasksの成功ログとstate.jsonの更新差分を突き合わせる

タスクスケジューラの実行結果ログと、スクリプト内部で更新している状態ファイル(state.json)のタイムスタンプを突き合わせて確認したところ、次のことが分かりました。

  • タスクスケジューラの実行タスクは wscript.exe 経由で .vbs スクリプトを呼び出し、そこから pythonw.exe を非表示で起動する構成になっていた。
  • wscript.exe から pythonw.exe を直接呼び出す構成では、プロセスの起動自体が確実にキックされない(起動漏れが発生する)ケースがあることを特定した。

つまり「タスクスケジューラのタスクとしては成功扱いになるが、その中で本来起動すべきPythonプロセス自体が実行されずに終わっている」ケースがあり、これが通知の欠落として現れていました。


対処:バッチファイルを1枚挟んでプロセス起動を確実にする

wscript.exe から pythonw.exe を直接叩く構成をやめ、間にバッチファイルを1枚挟む構成に変更しました。

  1. run_heartbeat.bat を新規作成
    • .env の読み込みと、実行結果のログ出力(heartbeat.logへの統合)をバッチファイル内で行う。
  2. run_heartbeat.vbs の呼び出し先を変更
    • pythonw.exe を直接呼んでいた処理を、run_heartbeat.bat を非表示(ウィンドウ非表示モード)で呼び出す形に変更。

構成をまとめると、以下のような呼び出し階層になります。

タスクスケジューラ (schtasks)
  └─ run_heartbeat.vbs(非表示実行のラッパー)
       └─ run_heartbeat.bat(.env読込 & ログ出力を統合)
            └─ pythonw.exe(本体スクリプト)

バッチファイルを経由させることで、環境変数の読み込みとログ出力を一箇所に集約でき、かつプロセスの起動自体も安定するようになりました。


検証

schtasks /run でタスクを手動実行し、heartbeat.logNotification Status: True が出力されることを確認しました。あわせてDiscord側にも通知が正常に着信することを確認し、対処が有効であることを確認しました。


まとめ・他の運用にも応用できるポイント

  1. 「タスク成功」と「中身の処理が実行された」は別物:タスクスケジューラの成功ログだけを見て安心せず、スクリプト内部の状態ファイルやログのタイムスタンプで実処理の実行有無を検証する。
  2. wscript.exe から実行ファイルを直接叩く構成は起動漏れのリスクがある:非表示実行のためにVBScriptラッパーを使う構成自体はよくあるが、直接実行ファイルを呼ぶのではなく、バッチファイルを1枚挟んでログ出力・環境変数読込・起動確認を担わせると安定しやすい。
  3. 通知系の処理は「届かないことがある」前提でログを仕込む:Webhook送信結果(成功/失敗)を必ずログに残しておくと、こうした「たまに起きる」系の不具合の切り分けが格段に楽になる。

バックグラウンド実行かつ通知を伴うタスクスケジューラ運用をしている場合、同様の構成の見直しが有効なケースがあるかもしれません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?