linux - 为什么我的屏幕会话在服务器启动过程中终止?
问题描述
首先是一些背景知识,我在运行 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
解决了所有这些问题,我遇到的问题是服务启动,并且我可以在服务运行时附加到屏幕会话,但是在服务器启动时屏幕会话会在几秒钟后终止. 我不知道为什么会这样。以我自己的用户身份启动服务器似乎可以正常工作,但我需要它能够作为系统用户的服务运行,以便服务器在启动时自动运行。
作为旁注,配置文件不能正常工作。
对此问题的任何想法和帮助将不胜感激。
解决方案
推荐阅读
- sql - 根据外表的内容选择SQL表的内容
- apache-spark - Azure 数据块:KafkaUtils createDirectStream 导致 Py4JNetworkError("Answer from Java side is empty") 错误
- javascript - 错误:未捕获(承诺):覆盖不存在(离子可选)
- sql - 有没有办法在 Oracle 中的列名之前获取表名引用?
- perl - Perl 除法给 JavaScript 带来不同的结果
- php - Symfony\Component\Debug\Exception\FatalErrorException laravel 错误
- java - 将 Recycler 项目单元格飞到目标单击时查看?
- jquery - jQuery 简单标签内容
- c# - C# HostBuilder 日志记录配置。非通用记录器为空
- java - OpenCV Java 在 Mat 上执行算术运算