mirror of
https://github.com/smartcmd/MinecraftConsoles.git
synced 2026-08-20 09:57:09 +00:00
fix: fix Failed to create window instance.
Wait for Xvfb to be fully ready before starting.
This commit is contained in:
parent
5f4b038d54
commit
ccbc666321
|
|
@ -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=(
|
||||
|
|
|
|||
Loading…
Reference in a new issue