diff --git a/.gitignore b/.gitignore index 1377554..b8b5ed4 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ +live_until.txt *.swp diff --git a/autoshutdown.sh b/autoshutdown.sh index 184e571..ae85b28 100755 --- a/autoshutdown.sh +++ b/autoshutdown.sh @@ -5,7 +5,7 @@ SERVER_DIR='/home/ubuntu/minecraft/servers/kincls' TMUX_NAME='minecraft kincls server' -EMPTY_COUNTER="$SERVER_DIR/empty_counter.txt" +LIVE_UNTIL="/home/ubuntu/minecraft/live_until.txt" json_parse() { cat - | python3 -c "import sys, json; print(json.load(sys.stdin)['$1'])" @@ -15,32 +15,33 @@ silent_exitcode() { $* > /dev/null 2>&1 } -empty_count() { - if [ ! -f "$EMPTY_COUNTER" ]; then - # File not existing - echo "0" - else - cat "$EMPTY_COUNTER" +extend_ttl() { + # Extend time to live 10 minutes at a time + new_ttl="$(date -d '+10 min' +%s)" + old_ttl="$(date -d "$(cat "$LIVE_UNTIL")" +%s)" + if [ ! -f "$LIVE_UNTIL" ] || [ "$new_ttl" -ge "$old_ttl" ]; then + # If LIVE_UNTIL file not existing or new time to live longer + echo "Extending time to live until $(date -d "@$new_ttl")" + date -d "@$new_ttl" > "$LIVE_UNTIL" fi + exit 0 } -empty_incr() { - c="$(empty_count)" - if [ "$c" -gt 10 ]; then - echo "Server empty for more than 10 minutes, shutting down" +soft_poweroff() { + # Poweroff, if time to live has expired + ttl="0" + if [ -f "$LIVE_UNTIL" ]; then + ttl="$(date -d "$(cat "$LIVE_UNTIL")" +%s)" + fi + echo "Time to live is $(cat "$LIVE_UNTIL")" + if [ "$(date +%s)" -ge "$ttl" ]; then + echo "Server empty longer than grace time, shutting down" empty_reset # Needs to be 0 next time server starts tmux send-keys -t "$TMUX_NAME.0" "stop" ENTER sleep 5 $(sudo /sbin/shutdown -P +1) - else - echo "Empty count $c. Incrementing" - echo "$((c+1))" > "$EMPTY_COUNTER" fi -} - -empty_reset() { - echo "Resetting empty counter" - echo 0 > "$EMPTY_COUNTER" + exit 1 } tmux_running() { @@ -56,16 +57,14 @@ echo "$(date) [$n_logins logins]" if [ "$n_logins" -gt 0 ]; then echo "Keep alive as there are active ssh sessions" - empty_reset - exit 0 + extend_ttl fi if tmux_running; then : #echo "Tmux running" else echo "Tmux not running" - empty_incr - exit 1 + soft_poweroff fi if server_responsive; then @@ -73,14 +72,11 @@ if server_responsive; then echo "Server responsive. $n_players players online" if [ "$n_players" -gt 0 ]; then # Keep alive as players are online - empty_reset - exit 0 + extend_ttl else - empty_incr - exit 1 + soft_poweroff fi else echo "Server unresponsive" - empty_incr - exit 1 + soft_poweroff fi diff --git a/services/ensure_running.service b/services/ensure_running.service new file mode 100644 index 0000000..e097ed4 --- /dev/null +++ b/services/ensure_running.service @@ -0,0 +1,9 @@ +[Unit] +Description=Launch minecraft server + +[Service] +Type=oneshot +ExecStart=/home/ubuntu/minecraft/ensure_running.sh + +[Install] +WantedBy=multi-user.target diff --git a/services/set_initial_ttl.service b/services/set_initial_ttl.service new file mode 100644 index 0000000..50ae93f --- /dev/null +++ b/services/set_initial_ttl.service @@ -0,0 +1,9 @@ +[Unit] +Description=Let server live for 1h after initial boot + +[Service] +Type=oneshot +ExecStart=/bin/sh -c 'date -d "+1 hour" > /home/ubuntu/minecraft/live_until.txt' + +[Install] +WantedBy=multi-user.target