首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该如何设置一个systemd服务来自动启动服务器并让我将命令传递给它呢?

我应该如何设置一个systemd服务来自动启动服务器并让我将命令传递给它呢?
EN

Unix & Linux用户
提问于 2021-11-04 18:58:50
回答 1查看 1K关注 0票数 5

目标:

我正试着让一个“我的世界”服务器在Fedora上运行在计算机引导系统上。我有一些自我强加的标准,我需要满足这些标准才能正确地管理我的服务器(S):

  1. 它必须以我用home dir /opt/minecraft创建的minecraft系统用户的身份运行。我尝试使用addusering,然后添加行User=minecraftWorkingDirectory=/opt/minecraft/
  2. 它必须具有可伸缩性,并且可以处理任意数量的服务器。我尝试使用模板服务,然后将WorkingDirectory行更改为WorkingDirectory=/opt/minecraft/%i,让我在目录中传递。
  3. 我必须能以某种方式将命令传递给它。这是我被困在上面的那个。我尝试过使用套接字单元,然后将其连接到/run/minecraft%I,但我一直无法让它工作。如果您不熟悉“我的世界”服务器,它们有一个交互式控制台,您可以将命令传递到其中。过去,我在运行在tmux send会话中的服务器时使用过tmux,但问题是它不会自动启动,而且感觉不优雅。

尝试解决方案:

/usr/local/lib/systemd/system/minecraft@.service

代码语言:javascript
复制
[Unit]
Description=Minecraft server: %i

# only run after networking is ready
After=network-online.target
Wants=network-online.target

[Service]
Type=simple

# restart if the server crashes
Restart=on-failure
RestartSec=5s

# set the input and outputs to a socket unit and the journal resp.
Sockets=minecraft@%i.socket
StandardInput=socket                     
StandardOutput=journal
StandardError=journal

# set the user and directory to the correct values
User=minecraft
WorkingDirectory=/opt/minecraft/%i/

# run the start script for the specified server
ExecStart=/bin/bash /opt/minecraft/%i/start.sh

[Install]
WantedBy=default.target

/usr/local/lib/systemd/system/minecraft@.socket

代码语言:javascript
复制
[Unit]
Description=Socket for Minecraft server: %i

[Socket]
# listen to a pipe for input
ListenFIFO=%t/minecraft%I.stdin

Service=minecraft@%i.service

问题:

当我尝试用sudo systemctl start minecraft@1_17_1.service启动服务器(我在/opt/minecraft/1_17_1/中安装了服务器)时,它失败了:

代码语言:javascript
复制
Job for minecraft@1_17_1.service failed because of unavailable resources or another system error.
See "systemctl status minecraft@1_17_1.service" and "journalctl -xeu minecraft@1_17_1.service" for details.

这促使我运行systemctl status minecraft@1_17_1.service

代码语言:javascript
复制
● minecraft@1_17_1.service - Minecraft server: 1_17_1
     Loaded: loaded (/usr/local/lib/systemd/system/minecraft@.service; enabled; vendor preset: disabled)
     Active: activating (auto-restart) (Result: resources) since Thu 2021-11-04 14:37:27 EDT; 163ms ago
TriggeredBy: × minecraft@1_17_1.socket
        CPU: 0

还有journalctl -xeu minecraft@1_17_1.service

代码语言:javascript
复制
Nov 04 14:51:01 riley-fedora systemd[1]: minecraft@1_17_1.service: Got no socket.
Nov 04 14:51:01 riley-fedora systemd[1]: minecraft@1_17_1.service: Failed to run 'start' task: Invalid argument
Nov 04 14:51:01 riley-fedora systemd[1]: minecraft@1_17_1.service: Failed with result 'resources'.
░░ Subject: Unit failed
░░ Defined-By: systemd
░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
░░ 
░░ The unit minecraft@1_17_1.service has entered the 'failed' state with result 'resources'.
Nov 04 14:51:01 riley-fedora systemd[1]: Failed to start Minecraft server: 1_17_1.
░░ Subject: A start job for unit minecraft@1_17_1.service has failed
░░ Defined-By: systemd
░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
░░ 
░░ A start job for unit minecraft@1_17_1.service has finished with a failure.
░░ 
░░ The job identifier is 55890 and the job result is failed.

我看到它似乎对我的minecraft@.socket文件很生气,所以我运行了systemctl status minecraft@1_17_1.socket

代码语言:javascript
复制
× minecraft@1_17_1.socket - Socket for Minecraft server: 1_17_1
     Loaded: loaded (/usr/local/lib/systemd/system/minecraft@.socket; static)
     Active: failed (Result: resources)
   Triggers: ● minecraft@1_17_1.service
     Listen: /run/minecraft1_17_1.stdin (FIFO)

Nov 04 14:52:35 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed with result 'resources'.
Nov 04 14:52:35 riley-fedora systemd[1]: Failed to listen on Socket for Minecraft server: 1_17_1.
Nov 04 14:52:41 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed to open FIFO /run/minecraft1_17_1.stdin: Permission denied
Nov 04 14:52:41 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed to listen on sockets: Permission denied
Nov 04 14:52:41 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed with result 'resources'.
Nov 04 14:52:41 riley-fedora systemd[1]: Failed to listen on Socket for Minecraft server: 1_17_1.
Nov 04 14:52:46 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed to open FIFO /run/minecraft1_17_1.stdin: Permission denied
Nov 04 14:52:46 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed to listen on sockets: Permission denied
Nov 04 14:52:46 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed with result 'resources'.
Nov 04 14:52:46 riley-fedora systemd[1]: Failed to listen on Socket for Minecraft server: 1_17_1.

因此,这个问题似乎与我所使用的管道的权限有关。

为了更好的衡量,我运行了journalctl -xeu minecraft@1_17_1.socket

代码语言:javascript
复制
Nov 04 14:52:46 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed to open FIFO /run/minecraft1_17_1.stdin: Permission denied
Nov 04 14:52:46 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed to listen on sockets: Permission denied
Nov 04 14:52:46 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed with result 'resources'.
░░ Subject: Unit failed
░░ Defined-By: systemd
░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
░░ 
░░ The unit minecraft@1_17_1.socket has entered the 'failed' state with result 'resources'.
Nov 04 14:52:46 riley-fedora systemd[1]: Failed to listen on Socket for Minecraft server: 1_17_1.
░░ Subject: A start job for unit minecraft@1_17_1.socket has failed
░░ Defined-By: systemd
░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
░░ 
░░ A start job for unit minecraft@1_17_1.socket has finished with a failure.
░░ 
░░ The job identifier is 58598 and the job result is failed.

问题:

我做错了什么?我花了4个小时在谷歌的第二页、第三页、甚至第四页上,没有任何解决方案。我在这里不知所措,所以我们非常感谢所有的帮助。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2021-11-05 09:58:40

我没有给你一个完整的答案,因为我不能重现这个问题。但是,我尝试将一个最小可验证的示例放在一起,并对故障排除提出了一些想法:

代码语言:javascript
复制
# /etc/systemd/system/sockinst@.service
[Service]
ExecStart=cat -
User=stew
Sockets=sockinst@%i.socket
StandardInput=socket
StandardOutput=journal
StandardError=journal
代码语言:javascript
复制
# /etc/systemd/system/sockinst@.socket
[Socket]
ListenFIFO=%t/sockinst%I.stdin
Service=sockinst@%i.service

然后运行此操作:

代码语言:javascript
复制
stew /etc/systemd/system $ systemctl start sockinst@1_1.service
stew /etc/systemd/system $ echo "Hello" > /run/sockinst1_1.stdin 
stew /etc/systemd/system $ systemctl status sockinst@1_1.{service,socket}
● sockinst@1_1.service - Testing instanced sockets 1_1
     Loaded: loaded (/etc/systemd/system/sockinst@.service; static)
     Active: active (running) since Fri 2021-11-05 10:35:41 CET; 37s ago
TriggeredBy: ● sockinst@1_1.socket

systemd[1]: Started Testing instanced sockets 1_1.
cat[11623]: Hello

● sockinst@1_1.socket - Socket for instance 1_1
     Loaded: loaded (/etc/systemd/system/sockinst@.socket; static)
     Active: active (running) since Fri 2021-11-05 10:35:41 CET; 37s ago
   Triggers: ● sockinst@1_1.service
     Listen: /run/sockinst1_1.stdin (FIFO)

systemd[1]: Listening on Socket for instance 1_1.

在这里,您可能会遇到一些技巧:

  1. 如果您使用systemctl stop minecraft@1_17_1.service,那么这不会停止并行套接字。这意味着/run/minecraft1_17_1.stdin将继续运行。事实上,如果您使用echo "hello" > /run/minecraft1_17_1.stdin,它将启动您的服务。我可以想象,如果您正在对您的服务进行故障排除,一个旧的套接字可能会影响您的测试。我建议两种选择之一:
    1. systemctl stop minecrat@1_17_1.{service,socket}阻止它,
    2. PartOf=minecraft@%i.service添加到套接字的[Unit]部分。这将导致它在服务停止时自动停止。

  2. 您正在使用Restart=on-failure。这对你的最终结果很好,但它可能掩盖了你最初的失败。在进行故障排除时,请考虑暂时删除此选项。当它失败时,你会看到它失败的最初原因。我的猜测是,服务器启动存在合法问题,但是套接字被绑定到第一个实例。然后,每次重新启动都无法在尝试ExecStart=之前绑定到旧套接字,因此从一开始就找不到它最初失败的原因。确保停止服务和套接字,然后启动它并立即检查输出。如果你的错误信息不一样,我也不会感到惊讶。
  3. 你把我的服务器描述为有一个gui。这是可选的,并且突然取决于设置您的DISPLAYXAUTHORITY之类的内容。那会带来很多东西会坏掉。考虑使用nogui选项在start.sh中调用您的服务,以消除导致初始故障的可能原因。如果您真的想要这个gui,那么您需要在脚本中设置DISPLAYXAUTHORITY环境变量(但这不一定是最简单的事情)。我建议至少在没有GUI的情况下试一试,看看这样是否能使您的服务运行。
  4. 您可能在编辑文件时忘记运行sudo systemctl daemon-reload。提醒您,一定要运行这个程序,以便systemd读取每个单元的最新版本。
票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/676199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档