このスクリプト群は、Linux 環境下で Puppeteer を使用する際に発生する WebSocket 接続の競合状態 (race condition) を解決するための非破壊的な待機機構である。Puppeteer の Chromium 起動プロセスを透過的にラップし、DevTools WebSocket が完全に利用可能になるまで適切に待機することで、接続エラーを防止する。
Puppeteer は内部的に Chrome DevTools Protocol を使用して Chromium ブラウザを制御するが、この通信は WebSocket 接続を通じて行われる。特に WSL 環境や仮想環境では、以下の問題が発生する可能性がある:
connect ECONNREFUSED 127.0.0.1:{PORT} エラーが発生し、puppeteer.launch() が失敗する一般的な対処法として以下が提案されることがあるが、それぞれに課題がある:
chrome-wrapper.sh # ラッパースクリプト
mmdc-wrapper.sh # ラッパースクリプト
prepare_puppeteer_env.sh # 環境設定用スクリプト
スクリプトは以下の環境変数を使用して非破壊的な動作を実現する:
PUPPETEER_EXECUTABLE_PATH: Puppeteer が使用する実行可能ファイルパスORG_PUPPETEER_EXECUTABLE_PATH: 元の実行可能ファイルパスの退避用DevTools WebSocket ポートが完全に利用可能になるまでの確認は、以下の 2 段階で行われる:
LISTEN 状態確認:
ss -tln | awk '{print $1, $4}' | grep -E '^LISTEN\s+127\.0\.0\.1:'"$PORT"'$'API 応答確認:
curl -s --max-time 0.2 "http://127.0.0.1:$PORT/json/version"stderr の出力は以下のロジックでバッファリングされる:
名前付きパイプ (FIFO) を使用して、Chromium プロセスの stderr 出力を非同期で処理する:
FIFO=$(mktemp -u)
mkfifo "$FIFO"
trap 'rm -f "$FIFO"' EXITchmod +x chrome-wrapper.sh
chmod +x prepare_puppeteer_env.sh
source prepare_puppeteer_env.sh
node your-puppeteer-script.js特定の Chromium バイナリを使用したい場合:
export ORG_PUPPETEER_EXECUTABLE_PATH="/path/to/custom/chrome"
source prepare_puppeteer_env.sh
node your-script.js既存の Puppeteer プロジェクトに影響を与えることなく導入できる:
cp chrome-wrapper.sh prepare_puppeteer_env.sh /your/project/
source prepare_puppeteer_env.sh
npm startスクリプトは以下のデバッグ情報を stderr に出力する:
echo "Chrome wrapper script started." >&2プロセス終了時に FIFO ファイルを確実に削除:
trap 'rm -f "$FIFO"' EXIT問題: ss: command not found
sudo apt-get install iproute2
sudo yum install iproute問題: curl: command not found
sudo apt-get install curl
sudo yum install curl問題: 権限エラー
chmod +x chrome-wrapper.sh prepare_puppeteer_env.shデバッグ時は以下の方法で詳細な動作を確認できる:
node your-script.js 2> debug.log
ps aux | grep chrome-wrapper