首页 > 解决方案 > 为什么我的屏幕会话在服务器启动过程中终止?

问题描述

首先是一些背景知识,我在运行 ESXi 的机器上运行 Ubuntu 64 位服务器。我今天刚刚专门为这个任务安装了这个虚拟机。这个任务是在尽可能少的外部干扰下运行 tModLoader 服务器。

我为 terraria 设置了 firewalld,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Terraria</short>
  <description>Open TCP port 7777 for incoming Terraria client connections.</description>
  <port protocol="tcp" port="7777"/>
</service>

我将 UFW 设置为仅允许 ssh 和端口 7777/tcp。

我使用以下命令为 iptables 添加了一条规则: sudo iptables -A INPUT -p tcp --dport 7777 -j ACCEPT

我使用选项 -r -m -d 创建了一个名为“terraria”的用户

除了安装在两个位置的 ModLoader 文件之外,我设置了服务器文件,/opt/terraria因为它们依赖于启动进程的用户。那些位置是~/.local/share/Terraria/ModLoader

我为 terraria 创建了一个服务,/etc/systemd/system/terraria.service如下所示:

[Unit]
Description=server daemon for terraria

[Service]
Type=forking
User=terraria
KillMode=none
ExecStart=/usr/bin/screen -dmS terraria /bin/bash -c "/opt/terraria/tModLoaderServer -config /opt/terraria/serverconfig.txt"
ExecStop=/usr/local/bin/terrariad exit

[Install]
WantedBy=multi-user.target



我制作了一个脚本,让我可以轻松访问服务启动的屏幕会话:

#!/usr/bin/env bash

send="`printf \"$*\r\"`"
attach='script /dev/null -qc "screen -r terraria"'
inject="screen -S terraria -X stuff $send"

if [ "$1" = "attach" ] ; then cmd="$attach" ; else cmd="$inject" ; fi

if [ "`stat -c '%u' /var/run/screen/S-terraria/`" = "$UID" ]
then
    $cmd
else
    su - terraria -c "$cmd"
fi

解决了所有这些问题,我遇到的问题是服务启动,并且我可以在服务运行时附加到屏幕会话,但是在服务器启动时屏幕会话会在几秒钟后终止. 我不知道为什么会这样。以我自己的用户身份启动服务器似乎可以正常工作,但我需要它能够作为系统用户的服务运行,以便服务器在启动时自动运行。

作为旁注,配置文件不能正常工作。

对此问题的任何想法和帮助将不胜感激。

标签: linuxgnu-screen

解决方案


推荐阅读