「自動化スクリプトがなぜか朝だけ失敗する…」そんな経験、ありませんか? 実はこれ、意外と多くの開発者がハマる落とし穴なんですよね。
今回は、ヘッドレスChrome(Headless Chrome)を使ったミラーリングスクリプトが、忙しい朝の時間帯だけ落ちてしまうという問題と、その解決策をわかりやすく解説します。
🔍 何が起きていたのか?

問題の状況はこうです。コンテンツ生成・公開ジョブが同時に走っているタイミングで、ヘッドレスChromeの起動が15秒のタイムアウト制限に引っかかり、セッション開始時に RuntimeError が発生。しかもリトライ処理がなかったため、1時間ごとのミラー処理が丸ごと死んでしまっていたんです。
厄介なのは「毎回失敗するわけじゃない」という点。マシンが暇なときはちゃんと動く。でも負荷が高い朝だけ死ぬ。こういう再現性の低いバグほど、原因特定が難しいですよね。
💡 なぜ朝だけ死ぬのか?
原因はシンプルです。Chromeのコールドスタート(初回起動)は、すでに他のプロセスがCPUやメモリを食っているときに極端に遅くなります。
ポイントをまとめるとこんな感じです👇
- 通常時: Chrome起動 → 数秒で完了 → タイムアウト前にセッション確立 ✅
- 高負荷時: Chrome起動 → 15秒超える →
RuntimeError→ 処理全体が死ぬ ❌
🛠 解決策:タイムアウトを延ばす+リトライを実装する
解決策は大きく2つです。①起動タイムアウトを伸ばす、②失敗時のリトライ処理を追加する。これだけで、朝の高負荷時でも安定して動くようになります。
Pythonで selenium を使っている場合、こんな感じで書けます。
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def create_driver(max_retries=3, timeout=30):
"""リトライ付きでヘッドレスChromeドライバーを起動する"""
options = Options()
options.add_argument("--headless") # ヘッドレスモードで起動
options.add_argument("--no-sandbox") # サンドボックス無効化(Linux環境向け)
options.add_argument("--disable-dev-shm-usage") # メモリ不足対策
for attempt in range(max_retries):
try:
# page_load_timeout でタイムアウトを延長する
driver = webdriver.Chrome(options=options)
driver.set_page_load_timeout(timeout)
print(f"✅ ドライバー起動成功(試行回数: {attempt + 1})")
return driver
except Exception as e:
print(f"⚠️ 起動失敗 ({attempt + 1}/{max_retries}): {e}")
if attempt < max_retries - 1:
time.sleep(5) # 少し待ってからリトライ
raise RuntimeError("Chromeドライバーの起動に失敗しました")
# 使い方
driver = create_driver(max_retries=3, timeout=30)
ここが重要です👇
max_retries=3:最大3回リトライするtime.sleep(5):リトライ前に5秒待つことで、マシンの負荷が落ち着くのを待てるset_page_load_timeout(30):デフォルトより長めのタイムアウトに設定
✅ まとめ
ヘッドレスChromeが「朝だけ死ぬ」問題の正体は、高負荷時のコールドスタート遅延によるタイムアウトでした。解決策は「タイムアウトを延ばす」+「リトライを仕込む」のセット対応です。
自動化スクリプトを本番運用するなら、こういった環境依存の失敗モードを想定したリトライ設計は必須ですよね。ぜひ自分のスクリプトにも取り入れてみてください! 🚀





