lower terraria idle draw further

This commit is contained in:
Matthew Tran 2025-04-11 03:23:52 -07:00
parent 292812f3f5
commit 12039fb862
4 changed files with 93 additions and 19 deletions

View File

@ -112,7 +112,7 @@ services:
terraria: terraria:
restart: always restart: always
build: terraria/. build: terraria/.
entrypoint: ["/bin/sh", "/home/me/entry.sh"] entrypoint: ["/usr/bin/python3", "/home/me/entry.py"]
ports: ports:
- "7777:7777" - "7777:7777"
networks: networks:

View File

@ -1,7 +1,7 @@
FROM ubuntu:24.04 FROM ubuntu:24.04
RUN apt-get update && apt-get -y upgrade RUN apt-get update && apt-get -y upgrade
RUN apt-get install -y wget unzip dotnet-runtime-8.0 RUN apt-get install -y wget unzip python3 iproute2 dotnet-runtime-8.0
RUN groupadd -g 2002 me && useradd -u 2002 -g 2002 -m me RUN groupadd -g 2002 me && useradd -u 2002 -g 2002 -m me
USER me USER me
@ -14,12 +14,10 @@ RUN unzip tModLoader.zip -d server && rm tModLoader.zip
RUN chmod +x server/start-tModLoaderServer.sh RUN chmod +x server/start-tModLoaderServer.sh
RUN mkdir server/tModLoader-Logs && touch server/tModLoader-Logs/server.log RUN mkdir server/tModLoader-Logs && touch server/tModLoader-Logs/server.log
RUN echo "" > server/LaunchUtils/InstallDotNet.sh RUN echo "" > server/LaunchUtils/InstallDotNet.sh
COPY --chown=me:me entry.sh ./ COPY --chown=me:me entry.py ./
COPY --chown=me:me config.default ./config.txt COPY --chown=me:me config.default ./config.txt
COPY --chown=me:me password.default ./password.txt COPY --chown=me:me password.default ./password.txt
COPY --chown=me:me config.tx[t] password.tx[t] ./ COPY --chown=me:me config.tx[t] password.tx[t] ./
# To add mods, install them on the client and copy over the .tmod files to mods/ # To add mods, install them on the client and copy over the .tmod files to mods/
# Then modify/create mods/enabled.json and add the desired mods to enable # Then modify/create mods/enabled.json and add the desired mods to enable
# TODO reduce idle cpu when no players...

90
terraria/entry.py Normal file
View File

@ -0,0 +1,90 @@
#!/usr/bin/env python3
import logging
import os
import signal
import socket
import subprocess
import time
class Runner:
def __init__(self):
self.server = None
signal.signal(signal.SIGINT, self.terminate)
signal.signal(signal.SIGTERM, self.terminate)
def run(self):
while True:
# low-power idle waiting for players
logging.info("waiting for connection attempt...")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(("0.0.0.0", 7777))
s.listen()
(c, addr) = s.accept()
c.close()
s.close()
logging.info(f"attempted connection from {addr}, starting server...")
# start server
with open("/home/me/password.txt", "r") as f:
password = f.read()
self.server = subprocess.Popen([
"/bin/bash",
"/home/me/server/start-tModLoaderServer.sh",
"-nosteam",
"-config", "/home/me/config.txt",
"-pass", f"{password}",
], stdin=subprocess.PIPE, start_new_session=True)
while not self.started():
time.sleep(1.0)
# wait until no connections for timeout
logging.info("server started, waiting until idle for 30s...")
idle_start = time.time()
while (time.time() - idle_start) < 30.0:
time.sleep(1.0)
if self.playing():
idle_start = time.time()
# stop server
self.exit()
while self.started():
time.sleep(1.0)
def started(self):
return b"LISTEN" in subprocess.check_output([
"ss", "-tln", "( sport = :7777 )"])
def playing(self):
return b"ESTAB" in subprocess.check_output([
"ss", "-tn", "( sport = :7777 )"])
def exit(self):
if self.server:
logging.info("shutting down server...")
self.server.stdin.write(b"exit\n")
self.server.stdin.flush()
timeout, start = True, time.time()
while (time.time() - start) < 8.0:
if self.server.poll() is not None:
timeout = False
break
time.sleep(0.25)
if timeout:
logging.error("forcefully shutting down server...")
os.killpg(os.getpgid(self.server.pid), signal.SIGKILL)
self.server = None
def terminate(self, signum, frame):
self.exit()
exit(0)
if __name__ == "__main__":
logging.basicConfig(
format="[%(asctime)s] [%(levelname)s] %(message)s",
level=logging.INFO,
datefmt="%Y-%m-%d %H:%M:%S",
)
runner = Runner()
runner.run()

View File

@ -1,14 +0,0 @@
#!/bin/sh
cleanup() {
echo "exit\n" > cmd
}
trap 'cleanup' TERM
rm cmd
mkfifo cmd
tail -f cmd | ./server/start-tModLoaderServer.sh -nosteam -config ../config.txt -pass $(cat password.txt) &
echo "help\n" > cmd # shell waits for FIFO to be opened for writing before starting program!
wait $! # wait for SIGTERM
wait $! # wait for server to stop