Advertisement

Automatic restarts for a Garry's Mod server

Garry's Mod servers get worse in a way you can actually see — gamemodes stuffed with addons leak Lua state, entity counts creep up, and a server that ran nicely yesterday is visibly slower today. There is a reason daily restarts are standard practice.

When should it restart?

Put {{minutes}} wherever the number of minutes left should appear.

What happens, in order

  1. Job startsWarnsay Server restarting in 15 min
  2. 10 min beforeWarnsay Server restarting in 10 min
  3. 5 min beforeWarnsay Server restarting in 5 min
  4. 1 min beforeWarnsay Server restarting in 1 min
  5. Restart timeStopquit

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

Moved 15 minutes ahead of the time you picked, so the restart happens at that time instead of 15 minutes later.

45 3 * * *  /opt/restart-gmod.sh

The script it runs

Save it as /opt/restart-gmod.sh and mark it executable. It expects rcon-cli on the path and takes the password from an environment variable instead of storing it in the file.

#!/usr/bin/env bash
set -euo pipefail

# Scheduled restart for Garry's Mod.
# Generated by spawnbench.com/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 || true

Heads up: cron follows the server clock, not your local time. Check with timedatectl first. A container set to UTC and an admin living in Europe differ by two hours in summer and by one in winter, so 04:00 may not be the 04:00 you had in mind.

Advertisement

What is different about Garry's Mod

You have nothing to save. The stock gamemodes build nothing that persists, and gamemodes that do keep data nearly always write it as they go rather than on shutdown. So the sequence is the simplest on this list: warn, then quit. If your gamemode does keep state in memory, read its documentation before trusting that a clean exit is sufficient.

Advertisement

Rather not run the server yourself?

These tools are free and funded by the two hosting services we run. If you want a server that is already set up, here they are.

Advertisement