diff options
Diffstat (limited to 'docker/dedicated-server/entrypoint.sh')
| -rw-r--r-- | docker/dedicated-server/entrypoint.sh | 78 |
1 files changed, 77 insertions, 1 deletions
diff --git a/docker/dedicated-server/entrypoint.sh b/docker/dedicated-server/entrypoint.sh index a8f8907a..26b40da9 100644 --- a/docker/dedicated-server/entrypoint.sh +++ b/docker/dedicated-server/entrypoint.sh @@ -30,6 +30,65 @@ ensure_persist_file() { ln -sfn "${persist_path}" "${runtime_path}" } +wait_for_xvfb_ready() { + local display="$1" + local xvfb_pid="$2" + local wait_seconds="${XVFB_WAIT_SECONDS:-10}" + local wait_ticks=$((wait_seconds * 10)) + local display_number="${display#:}" + display_number="${display_number%%.*}" + + if [ -z "${display_number}" ] || ! [[ "${display_number}" =~ ^[0-9]+$ ]]; then + echo "[error] Invalid DISPLAY format for Xvfb wait: ${display}" >&2 + return 1 + fi + + local socket_path="/tmp/.X11-unix/X${display_number}" + local elapsed=0 + + while [ "${elapsed}" -lt "${wait_ticks}" ]; do + if ! kill -0 "${xvfb_pid}" 2>/dev/null; then + echo "[error] Xvfb exited before the display became ready." >&2 + if [ -f /tmp/xvfb.log ]; then + echo "[error] ---- /tmp/xvfb.log ----" >&2 + tail -n 200 /tmp/xvfb.log >&2 || true + echo "[error] ----------------------" >&2 + fi + return 1 + fi + + if [ -S "${socket_path}" ]; then + # Keep a short extra delay so Wine does not race display handshake. + sleep 0.2 + if kill -0 "${xvfb_pid}" 2>/dev/null && [ -S "${socket_path}" ]; then + return 0 + fi + fi + + # One more liveness check after the ready probe branch. + if ! kill -0 "${xvfb_pid}" 2>/dev/null; then + echo "[error] Xvfb exited during display readiness probe." >&2 + if [ -f /tmp/xvfb.log ]; then + echo "[error] ---- /tmp/xvfb.log ----" >&2 + tail -n 200 /tmp/xvfb.log >&2 || true + echo "[error] ----------------------" >&2 + fi + return 1 + fi + + sleep 0.1 + elapsed=$((elapsed + 1)) + done + + echo "[error] Timed out waiting for Xvfb display ${display}." >&2 + if [ -f /tmp/xvfb.log ]; then + echo "[error] ---- /tmp/xvfb.log ----" >&2 + tail -n 200 /tmp/xvfb.log >&2 || true + echo "[error] ----------------------" >&2 + fi + return 1 +} + if [ ! -d "$SERVER_DIR" ]; then echo "[error] Server directory not found: $SERVER_DIR" >&2 exit 1 @@ -78,8 +137,25 @@ fi if [ -z "${DISPLAY:-}" ]; then export DISPLAY="${XVFB_DISPLAY:-:99}" XVFB_SCREEN="${XVFB_SCREEN:-64x64x16}" + DISPLAY_NUMBER="${DISPLAY#:}" + DISPLAY_NUMBER="${DISPLAY_NUMBER%%.*}" + if [ -z "${DISPLAY_NUMBER}" ] || ! [[ "${DISPLAY_NUMBER}" =~ ^[0-9]+$ ]]; then + echo "[error] Invalid XVFB_DISPLAY format: ${DISPLAY}" >&2 + exit 1 + fi + XVFB_SOCKET="/tmp/.X11-unix/X${DISPLAY_NUMBER}" + XVFB_LOCK="/tmp/.X${DISPLAY_NUMBER}-lock" + # The check is performed assuming the same container will be restarted. + if [ -S "${XVFB_SOCKET}" ] || [ -e "${XVFB_LOCK}" ]; then + echo "[warn] Removing stale Xvfb state for ${DISPLAY} before startup." >&2 + rm -f "${XVFB_SOCKET}" "${XVFB_LOCK}" + fi Xvfb "${DISPLAY}" -nolisten tcp -screen 0 "${XVFB_SCREEN}" >/tmp/xvfb.log 2>&1 & - sleep 0.2 + XVFB_PID=$! + wait_for_xvfb_ready "${DISPLAY}" "${XVFB_PID}" + echo "[info] Xvfb ready on ${DISPLAY} (pid=${XVFB_PID}, screen=${XVFB_SCREEN})" +else + echo "[info] Using existing DISPLAY=${DISPLAY}; skipping Xvfb startup" fi args=( |
