#!/bin/sh set -eu resolve_chrome_path() { if [ -n "${CHROME_PATH:-}" ] && [ -x "$CHROME_PATH" ]; then return 0 fi for candidate in \ /usr/bin/google-chrome-stable \ /usr/bin/google-chrome \ /opt/google/chrome/google-chrome \ /usr/bin/chromium \ /usr/bin/chromium-browser; do if [ -x "$candidate" ]; then CHROME_PATH="$candidate" return 0 fi done if command -v google-chrome-stable >/dev/null 2>&1; then CHROME_PATH="$(command -v google-chrome-stable)" return 0 fi if command -v google-chrome >/dev/null 2>&1; then CHROME_PATH="$(command -v google-chrome)" return 0 fi if command -v chromium >/dev/null 2>&1; then CHROME_PATH="$(command -v chromium)" return 0 fi if command -v chromium-browser >/dev/null 2>&1; then CHROME_PATH="$(command -v chromium-browser)" return 0 fi echo "No Chrome/Chromium executable found. Set CHROME_PATH to a valid binary." >&2 exit 1 } resolve_chrome_path export CHROME_PATH export PUPPETEER_EXECUTABLE_PATH="${PUPPETEER_EXECUTABLE_PATH:-$CHROME_PATH}" rm -f /tmp/.X99-lock Xvfb :99 -screen 0 1024x768x24 & xvfb_pid=$! export DISPLAY=:99 npm start & app_pid=$! term_handler() { kill "$app_pid" 2>/dev/null || true kill "$xvfb_pid" 2>/dev/null || true } trap term_handler INT TERM while kill -0 "$app_pid" 2>/dev/null; do if ! kill -0 "$xvfb_pid" 2>/dev/null; then echo "Xvfb exited; stopping app." >&2 kill "$app_pid" 2>/dev/null || true wait "$app_pid" 2>/dev/null || true exit 1 fi sleep 1 done wait "$app_pid" app_status=$? kill "$xvfb_pid" 2>/dev/null || true wait "$xvfb_pid" 2>/dev/null || true exit "$app_status"