Python応用

ヘッドレスChromeが朝だけクラッシュする問題、原因と解決策を徹底解説

「自動化スクリプトがなぜか朝だけ失敗する…」そんな経験、ありませんか? 実はこれ、意外と多くの開発者がハマる落とし穴なんですよね。

今回は、ヘッドレスChrome(Headless Chrome)を使ったミラーリングスクリプトが、忙しい朝の時間帯だけ落ちてしまうという問題と、その解決策をわかりやすく解説します。

🔍 何が起きていたのか?

headless browser
headless browser / Photo by Christina Morillo via Pexels

問題の状況はこうです。コンテンツ生成・公開ジョブが同時に走っているタイミングで、ヘッドレス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が「朝だけ死ぬ」問題の正体は、高負荷時のコールドスタート遅延によるタイムアウトでした。解決策は「タイムアウトを延ばす」+「リトライを仕込む」のセット対応です。

自動化スクリプトを本番運用するなら、こういった環境依存の失敗モードを想定したリトライ設計は必須ですよね。ぜひ自分のスクリプトにも取り入れてみてください! 🚀

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

もしも

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

AIコーディングの現場活用法を学ぶ一冊

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です