Schedule a Garry's Mod server restart
Garry's Mod servers degrade in a way that is unusually visible — addon-heavy gamemodes leak Lua state, entity counts climb, and a server that felt fine yesterday is noticeably worse today. A daily restart is common practice for a reason.
When should it restart?
Use {{minutes}} where the countdown number should go.
What happens, in order
- Job startsWarn
say Server restarting in 15 min - 10 min beforeWarn
say Server restarting in 10 min - 5 min beforeWarn
say Server restarting in 5 min - 1 min beforeWarn
say Server restarting in 1 min - Restart timeStop
quit
There is no world to save — Garry’s Mod builds nothing persistent by default, so the restart is just a clean process exit. Gamemodes that do persist data usually save continuously.
The crontab line
Shifted 15 minutes earlier than your chosen time, so the restart itself lands on it rather than 15 minutes after.
45 3 * * * /opt/restart-gmod.sh
The script it runs
Save as /opt/restart-gmod.sh and make it executable. It assumes rcon-cli is on the path and reads the password from the environment rather than embedding it.
#!/usr/bin/env bash
set -euo pipefail
# Scheduled restart for Garry's Mod.
# Generated by spawnly.net/tools/restart-scheduler
# The password stays out of this file. Put it in the environment, or in a
# file only root can read, and export it before this script runs.
RCON_HOST="${RCON_HOST:-127.0.0.1}"
RCON_PORT="${RCON_PORT:-27015}"
: "${RCON_PASSWORD:?set RCON_PASSWORD before running}"
send() {
rcon-cli --host "$RCON_HOST" --port "$RCON_PORT" --password "$RCON_PASSWORD" "$1"
}
# 15 minute warning
send 'say Server restarting in 15 min'
sleep 300
# 10 minute warning
send 'say Server restarting in 10 min'
sleep 300
# 5 minute warning
send 'say Server restarting in 5 min'
sleep 240
# 1 minute warning
send 'say Server restarting in 1 min'
sleep 70
# Shut down cleanly
send 'quit'
# Give the process time to finish writing before anything restarts it.
sleep 30
systemctl start gmod 2>/dev/null || trueCron uses the server’s timezone, not yours. Check it with timedatectl before assuming 04:00 means 04:00 where you are — a container in UTC and an admin in Europe are two hours apart in summer and one in winter.
The part specific to Garry's Mod
There is nothing to save. The default gamemodes build nothing persistent, and gamemodes that do persist data almost always write it continuously rather than at shutdown. That makes the sequence simpler here than anywhere else on this list: warn, then quit. If your gamemode does hold state in memory, check its documentation before assuming a clean exit is enough.