Schedule a Factorio server restart

Factorio is the game on this list that least needs a scheduled restart. It is built to run for weeks, its memory use is proportional to the factory rather than to uptime, and a headless server left alone will simply keep working.

When should it restart?

Use {{minutes}} where the countdown number should go.

What happens, in order

  1. Job startsWarnServer restarting in 15 min
  2. 10 min beforeWarnServer restarting in 10 min
  3. 5 min beforeWarnServer restarting in 5 min
  4. 1 min beforeWarnServer restarting in 1 min
  5. Restart timeSave/server-save
  6. Restart timeStop/quit

Plain text sent over Factorio RCON is printed straight into chat, which is why the broadcast line has no command in front of it. Anything starting with a slash is treated as a command instead.

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-factorio.sh

The script it runs

Save as /opt/restart-factorio.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 Factorio.
# 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 'Server restarting in 15 min'

sleep 300
# 10 minute warning
send 'Server restarting in 10 min'

sleep 300
# 5 minute warning
send 'Server restarting in 5 min'

sleep 240
# 1 minute warning
send 'Server restarting in 1 min'

sleep 60
# Flush the world to disk
send '/server-save'

sleep 10
# Shut down cleanly
send '/quit'

# Give the process time to finish writing before anything restarts it.
sleep 30
systemctl start factorio 2>/dev/null || true

Cron 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 Factorio

The reason to schedule one anyway is the save, not the restart — running /server-save on a timer gives you a rotation of recovery points that autosaves alone do not. Note that plain text sent over Factorio's RCON is printed straight into chat, which is why the warning line has no command in front of it; anything beginning with a slash is treated as a command instead.

Support & Help