@@ -31,7 +31,7 @@ if [ "$EXTERNAL_CONFIG" -eq 0 ]; then
3131 [ -z " ${SERVER_PASSWORD:- } " ] && \
3232 echo " $( timestamp) WARN: SERVER_PASSWORD not set, server will be public"
3333else
34- echo " $( timestamp) INFO: EXTERNAL_CONFIG is set, checking for presence and permmission "
34+ echo " $( timestamp) INFO: EXTERNAL_CONFIG is set, checking for presence and permission "
3535 if [ ! -f " $ENSHROUDED_CONFIG " ]; then
3636 echo " $( timestamp) ERROR: EXTERNAL_CONFIG set but config not found at $ENSHROUDED_CONFIG "
3737 exit 1
4242 echo " $( timestamp) INFO: Adjust ownership and restart the container (e.g. sudo chown 10000:10000 /path/to/your/enshrouded_server.json)"
4343 exit 1
4444 fi
45+ echo " $( timestamp) INFO: External config found and ownership looks good"
4546fi
4647
4748# #######################################
6667# Config handling
6768# #######################################
6869
70+ # Only modify config if we are not using external config
6971if [ " $EXTERNAL_CONFIG " -eq 0 ]; then
7072 if [ ! -f " $ENSHROUDED_CONFIG " ]; then
7173 echo " $( timestamp) INFO: Server config not present, copying example"
@@ -88,21 +90,29 @@ if [ "$EXTERNAL_CONFIG" -eq 0 ]; then
8890 | .ip = $i
8991 | (if $p != "" then .userGroups[]?.password = $p else . end)
9092 ' " $ENSHROUDED_CONFIG " > " $tmpfile " \
91- && mv " $tmpfile " " $ENSHROUDED_CONFIG "
93+ && mv " $tmpfile " " $ENSHROUDED_CONFIG " && chmod 644 " $ENSHROUDED_CONFIG "
9294fi
9395
96+ # We will use the query port for monitoring server state instead of pid
97+ # Retrieve port form the config as that is absolute source of truth
98+ QUERY_PORT=$( jq -r ' .queryPort' " $ENSHROUDED_CONFIG " )
99+ # Convert port to hex
100+ QUERY_PORT_HEX=$( printf ' %04X' " $QUERY_PORT " )
101+
94102# #######################################
95- # Savegame & logs
103+ # Permissions & logs
96104# #######################################
97105
98106mkdir -p " $ENSHROUDED_PATH /savegame" " $ENSHROUDED_PATH /logs"
99107
108+ # Check savegame directory is writable
100109if ! touch " $ENSHROUDED_PATH /savegame/.permtest" ; then
101110 echo " $( timestamp) ERROR: Savegame directory is not writable"
102111 exit 1
103112fi
104113rm -f " $ENSHROUDED_PATH /savegame/.permtest"
105114
115+ # Link logs to stdout
106116: > " $ENSHROUDED_PATH /logs/enshrouded_server.log"
107117ln -sf /proc/1/fd/1 " $ENSHROUDED_PATH /logs/enshrouded_server.log"
108118
@@ -117,22 +127,28 @@ echo "$(timestamp) INFO: Starting Enshrouded Dedicated Server"
117127" ${STEAMCMD_PATH} /compatibilitytools.d/GE-Proton${GE_PROTON_VERSION} /proton" \
118128 run " $ENSHROUDED_PATH /enshrouded_server.exe" &
119129
120- # Wait for process to start
121- for i in {1..10}; do
122- if pgrep -f enshrouded_server.exe > /dev/null; then
130+ # Wait for server to be up by checking UDP port
131+ echo " $( timestamp) INFO: Waiting for server to be up and listening on UDP port $QUERY_PORT "
132+
133+ for i in {1..30}; do
134+ if awk ' {print $2}' /proc/net/udp | grep -q " :$QUERY_PORT_HEX $" ; then
135+ echo " $( timestamp) INFO: Server is up and listening on UDP port $QUERY_PORT "
123136 break
124137 fi
125- sleep 6
126- echo " $( timestamp) INFO: Waiting for enshrouded_server.exe"
127- if [ " $i " -eq 10 ]; then
128- echo " $( timestamp) ERROR: Timed out waiting for server to start"
138+
139+ if [ " $i " -eq 30 ]; then
140+ echo " $( timestamp) ERROR: Timed out waiting for server to be up and listening on UDP port $QUERY_PORT "
129141 exit 1
130142 fi
143+
144+ sleep 2
131145done
132146
133- # Hold us open until we recieve a SIGTERM
134- while pgrep -f ' [e]nshrouded_server.exe' > /dev/null; do
135- sleep 10
147+ # Hold the container open while the server is running by monitoring the UDP port
148+ echo " $( timestamp) INFO: Monitoring server heartbeat via UDP port $QUERY_PORT "
149+
150+ while awk ' {print $2}' /proc/net/udp | grep -q " :$QUERY_PORT_HEX $" ; do
151+ sleep 3
136152done
137153
138154exit 0
0 commit comments