Skip to content

Commit 4353a34

Browse files
committed
refactor(server_lifecycle): Introduce graceful server shutdown and port management
Changes to entrypoint.sh: - Implemented wait_for_ports_free function for ensuring ports are free before starting or restarting the server. - Added constants for UDP and TCP ports, SHUTDOWN_TIMEOUT variable. - Modified start_server() function to start the server gracefully with a timeout. - Modified stop_server() function to gracefully stop the server, ask nicely first, and wait for it to finish before continuing. If the server does not stop within the specified time, it will be force killed. - Added wait_for_ports_free after stopping the server to ensure ports are free before starting a new server instance or exiting the script. These changes improve the server's graceful shutdown and port management for a smoother user experience.
1 parent ebe96c9 commit 4353a34

File tree

1 file changed

+51
-6
lines changed

1 file changed

+51
-6
lines changed

entrypoint.sh

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,27 @@ apply_env_to_config() {
9696
apply_env_to_config
9797

9898
# -------------------------------------------------
99-
# Start / stop
99+
# Server lifecycle
100100
# -------------------------------------------------
101101
SERVER_PID=""
102102

103+
UDP_PORT=2456
104+
TCP_PORT=2457
105+
SHUTDOWN_TIMEOUT=15
106+
107+
wait_for_ports_free() {
108+
echo "[VNyanNet] Waiting for ports to be released..."
109+
for i in {1..20}; do
110+
if ! ss -lunpt | grep -q ":$UDP_PORT" && ! ss -ltnp | grep -q ":$TCP_PORT"; then
111+
echo "[VNyanNet] Ports are free"
112+
return 0
113+
fi
114+
sleep 0.5
115+
done
116+
117+
echo "⚠️ Ports still in use, continuing anyway"
118+
}
119+
103120
start_server() {
104121
apply_env_to_config
105122
echo "[VNyanNet] Starting server..."
@@ -108,11 +125,36 @@ start_server() {
108125
}
109126

110127
stop_server() {
111-
if [[ -n "$SERVER_PID" ]] && kill -0 "$SERVER_PID" 2>/dev/null; then
112-
echo "[VNyanNet] Stopping server (PID $SERVER_PID)"
113-
kill "$SERVER_PID" 2>/dev/null || true
114-
wait "$SERVER_PID" 2>/dev/null || true
128+
if [[ -z "$SERVER_PID" ]]; then
129+
return
130+
fi
131+
132+
if ! kill -0 "$SERVER_PID" 2>/dev/null; then
133+
return
115134
fi
135+
136+
echo "[VNyanNet] Gracefully stopping server (PID $SERVER_PID)"
137+
138+
# Ask nicely first
139+
kill -TERM "$SERVER_PID" 2>/dev/null || true
140+
141+
for i in $(seq 1 "$SHUTDOWN_TIMEOUT"); do
142+
if ! kill -0 "$SERVER_PID" 2>/dev/null; then
143+
echo "[VNyanNet] Server stopped cleanly"
144+
SERVER_PID=""
145+
wait_for_ports_free
146+
return
147+
fi
148+
sleep 1
149+
done
150+
151+
# Force kill if needed
152+
echo "⚠️ Server did not stop in time — force killing"
153+
kill -KILL "$SERVER_PID" 2>/dev/null || true
154+
wait "$SERVER_PID" 2>/dev/null || true
155+
SERVER_PID=""
156+
157+
wait_for_ports_free
116158
}
117159

118160
trap stop_server SIGINT SIGTERM
@@ -123,9 +165,12 @@ trap stop_server SIGINT SIGTERM
123165
start_server
124166

125167
echo "[VNyanNet] Watching config for changes..."
168+
126169
while true; do
127-
inotifywait -e modify,close_write,move,create,delete "$CONFIG_FILE" >/dev/null 2>&1
170+
inotifywait -e close_write "$CONFIG_FILE" >/dev/null 2>&1
171+
128172
echo "[VNyanNet] Config changed — restarting server"
129173
stop_server
174+
sleep 1
130175
start_server
131176
done

0 commit comments

Comments
 (0)