Ubuntu下如何将Tmux运行TShock的脚本设为systemd启动服务
解决方案:修复systemd启动tmux内TShock服务器的问题
一、先排查TShock启动失败的原因
首先要明确TShock进程退出的具体原因,给启动脚本加上日志输出是最直接的方法:
修改/home/kokonoe/terraria/start-server.sh:
#!/bin/bash # 显式设置必要的环境变量 export DOTNET_ROOT=/home/kokonoe/terraria/tshock/dotnet export PATH=$DOTNET_ROOT:$PATH # 将服务器输出重定向到日志文件,方便排查错误 /home/kokonoe/terraria/tshock/TShock.Server -config /home/kokonoe/terraria/serverconfig >> /home/kokonoe/terraria/server.log 2>&1
启动服务后查看日志:
cat /home/kokonoe/terraria/server.log
如果日志出现dotnet: command not found或类似依赖错误,说明环境变量配置不全。
二、优化systemd服务配置
systemd的运行环境和交互式shell差异很大,不要依赖~/.bashrc中的变量,直接在服务文件里配置更可靠。修改/etc/systemd/system/terraria-autostart.service:
[Unit] Description=Runs TShock in a tmux session After=network.target # 确保网络就绪后再启动服务器 [Service] # 使用绝对路径执行tmux命令,避免PATH查找问题 ExecStart=/usr/bin/tmux new -s tshock -d "/bin/bash /home/kokonoe/terraria/start-server.sh" && \ /usr/bin/tmux split-window -t tshock -h "htop" && \ /usr/bin/tmux last-pane -t tshock User=kokonoe WorkingDirectory=/home/kokonoe/terraria # 设置工作目录为服务器所在路径 # 显式配置环境变量 Environment="DOTNET_ROOT=/home/kokonoe/terraria/tshock/dotnet" Environment="PATH=/home/kokonoe/terraria/tshock/dotnet:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" Type=oneshot RemainAfterExit=yes TimeoutStartSec=30 # 给服务器足够的启动时间 [Install] WantedBy=multi-user.target
三、重新加载服务并测试
执行以下命令使配置生效:
sudo systemctl daemon-reload sudo systemctl restart terraria-autostart
之后用tmux attach -t tshock连接会话,检查两个pane是否正常运行;若仍有问题,再查看server.log中的错误信息定位问题。
四、关于最佳实现方式的说明
如果核心需求是稳定运行TShock服务器,更推荐直接用systemd托管TShock进程(无需tmux),这样systemd可以自动监控进程状态,崩溃时自动重启,配置示例:
[Unit] Description=TShock Terraria Server After=network.target [Service] User=kokonoe WorkingDirectory=/home/kokonoe/terraria Environment="DOTNET_ROOT=/home/kokonoe/terraria/tshock/dotnet" Environment="PATH=/home/kokonoe/terraria/tshock/dotnet:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ExecStart=/home/kokonoe/terraria/tshock/TShock.Server -config /home/kokonoe/terraria/serverconfig Restart=always # 进程崩溃自动重启 RestartSec=5 [Install] WantedBy=multi-user.target
如果确实需要在tmux中同时运行htop和服务器,之前的tmux方案是可行的,但要注意:tmux会话属于用户进程,systemd仅负责启动会话,不会监控会话内的服务器进程,若TShock崩溃,需手动重启或在脚本中添加监控逻辑。
内容的提问来源于stack exchange,提问作者Kokonoe
相关产品推荐
相关产品推荐

