Schedule a Team Fortress 2 server restart
Team Fortress 2 servers hold nothing persistent, so restarting is about clearing state and picking up config changes rather than protecting anything. A weekly restart is plenty for most community servers.
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
Nothing to save. Time the restart for a map change if you can.
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-tf2.sh
The script it runs
Save as /opt/restart-tf2.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 Team Fortress 2.
# 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 tf2 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 Team Fortress 2
Try to land the restart on a map change rather than mid-round. Cron cannot see the game state, so the practical approach is to pick an hour when the server is usually empty and accept that occasionally it will not be. If your server runs custom maps, remember that everyone reconnecting after a restart has to redownload nothing but does have to reconnect — which on a busy server means a visible dip.