Files
game-server/players/p2_config/start-steam.sh
bilal ab4ee8b9d6 Fix Steam login flicker with 2GB shm and stable launch scripts.
Use tini-backed entrypoint, two-phase Steam startup, and a window keeper so CEF UI and the fluxbox toolbar stay visible in Moonlight.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-27 18:47:58 +03:00

119 lines
3.5 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
exec 9>/tmp/start-steam.lock
flock -n 9 || exit 0
id steam >/dev/null 2>&1 || useradd -m -s /bin/bash steam
STEAM_UID="$(id -u steam)"
ROOT=/home/steam/.local/share/Steam/debian-installation
mkdir -p "${ROOT}" /tmp/xdg-steam /home/steam/tmp /run/dbus
ln -sfn /home/steam/.local/share/Steam /home/steam/.steam
chown -R steam:steam /home/steam /tmp/xdg-steam
ensure_dbus() {
if ! dbus-send --system --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.ListNames >/dev/null 2>&1; then
rm -f /run/dbus/pid
dbus-daemon --system --fork >/dev/null 2>&1 || true
fi
}
ensure_fluxbox() {
cp -f /etc/game-server/fluxbox/init /root/.fluxbox/init 2>/dev/null || true
if ps -eo stat=,comm= 2>/dev/null | awk '$2=="fluxbox" && $1 !~ /Z/ { exit 0 } END { exit 1 }'; then
FB="$(ps -eo pid=,stat=,comm= | awk '$3=="fluxbox" && $2 !~ /Z/ {print $1; exit}')"
DISPLAY=:99 fluxbox-remote reloadconfig 2>/dev/null || kill -USR1 "${FB}" 2>/dev/null || true
return 0
fi
DISPLAY=:99 HOME=/root fluxbox >/dev/null 2>&1 &
sleep 1
}
restart_fluxbox() {
pkill -x fluxbox >/dev/null 2>&1 || true
sleep 1
cp -f /etc/game-server/fluxbox/init /root/.fluxbox/init 2>/dev/null || true
DISPLAY=:99 HOME=/root fluxbox >/dev/null 2>&1 &
sleep 1
DISPLAY=:99 xsetroot -solid "#3c3c3c" 2>/dev/null || true
}
steam_running() {
pgrep -u steam -f "${ROOT}/ubuntu12_32/steam -srt-logger-opened" >/dev/null 2>&1
}
steam_ui_visible() {
DISPLAY=:99 xwininfo -root -tree 2>/dev/null | grep -qE "Steam Big Picture Mode|Sign in to Steam"
}
ensure_window_keeper() {
command -v xdotool >/dev/null 2>&1 || return 0
pgrep -f keep-steam-window.sh >/dev/null 2>&1 && return 0
setsid bash /root/.config/sunshine/keep-steam-window.sh >/dev/null 2>&1 &
}
schedule_gamepadui_once() {
[ -f /tmp/steam-gamepadui-done ] && return 0
setsid bash -lc '
for _ in $(seq 1 90); do
pgrep -u steam -f steamwebhelper >/dev/null 2>&1 && break
sleep 1
done
sleep 5
runuser -u steam -- env \
DISPLAY=:99 \
HOME=/home/steam \
XDG_RUNTIME_DIR=/tmp/xdg-steam \
TMPDIR=/home/steam/tmp \
LANG=en_US.UTF-8 \
LC_ALL=en_US.UTF-8 \
/usr/games/steam steam://open/gamepadui >/dev/null 2>&1 || true
touch /tmp/steam-gamepadui-done
' >/dev/null 2>&1 &
}
stop_steam() {
pkill -9 -u steam -f "steam|steamwebhelper|steam-runtime|steam-runtime-launcher" >/dev/null 2>&1 || true
pkill -f keep-steam-window.sh >/dev/null 2>&1 || true
sleep 1
rm -f /home/steam/.local/share/Steam/steam.pid \
/home/steam/.local/share/Steam/steam.pipe \
/home/steam/.local/share/Steam/steam.token \
/tmp/steam-gamepadui-done
rm -rf /home/steam/.local/share/Steam/debian-installation/config/htmlcache
rm -rf /tmp/dumps/completed /tmp/dumps/*.lock 2>/dev/null || true
rm -f /dev/shm/u"${STEAM_UID}"-* /dev/shm/u"${STEAM_UID}"-ValveIPC* /dev/shm/.org.chromium.* /dev/shm/pulse-* 2>/dev/null || true
}
ensure_dbus
restart_fluxbox
if steam_running; then
if steam_ui_visible; then
ensure_window_keeper
exit 0
fi
schedule_gamepadui_once
ensure_window_keeper
exit 0
fi
stop_steam
ensure_dbus
restart_fluxbox
setsid runuser -u steam -- env \
DISPLAY=:99 \
HOME=/home/steam \
XDG_RUNTIME_DIR=/tmp/xdg-steam \
TMPDIR=/home/steam/tmp \
LANG=en_US.UTF-8 \
LC_ALL=en_US.UTF-8 \
bash -lc "cd ${ROOT} && exec /usr/games/steam -silent -no-cef-sandbox" \
>>/home/steam/steam-app.log 2>&1 &
schedule_gamepadui_once
ensure_window_keeper
exit 0