Automatic restarts for a Don't Starve Together server
Don't Starve Together is meant to keep running; a world that moves on while nobody plays is the whole idea. Restarting it is about recovering memory after long uptimes, not about anything the game itself requires.
When should it restart?
Put {{minutes}} wherever the number of minutes left should appear.
What happens, in order
- Job startsWarn
c_announce("Server restarting in 15 min") - 10 min beforeWarn
c_announce("Server restarting in 10 min") - 5 min beforeWarn
c_announce("Server restarting in 5 min") - 1 min beforeWarn
c_announce("Server restarting in 1 min") - Restart timeSave
c_save() - Restart timeStop
c_shutdown()
The console takes Lua, which is why these look like function calls. In a cluster with caves you must send the sequence to every shard — each one is a separate server with its own world to save.
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-dst.sh
The script it runs
Save it as /opt/restart-dst.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 Don't Starve Together.
# 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:-10998}"
: "${RCON_PASSWORD:?set RCON_PASSWORD before running}"
send() {
rcon-cli --host "$RCON_HOST" --port "$RCON_PORT" --password "$RCON_PASSWORD" "$1"
}
# 15 minute warning
send 'c_announce("Server restarting in 15 min")'
sleep 300
# 10 minute warning
send 'c_announce("Server restarting in 10 min")'
sleep 300
# 5 minute warning
send 'c_announce("Server restarting in 5 min")'
sleep 240
# 1 minute warning
send 'c_announce("Server restarting in 1 min")'
sleep 60
# Flush the world to disk
send 'c_save()'
sleep 10
# Shut down cleanly
send 'c_shutdown()'
# Give the process time to finish writing before anything restarts it.
sleep 30
systemctl start dst 2>/dev/null || trueHeads 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 Don't Starve Together
Its console accepts Lua, hence commands that look like function calls. What really matters is the cluster: a world with caves is two servers with two saves, and the sequence has to reach both of them. Send it to the master shard alone and the surface is saved while everything below ground is left behind.
Advertisement