我正在尝试在运行 Debian 10 的 VM 上运行 Minecraft 服务器。我已将服务器设置为作为服务运行,并尝试使用套接字监听基于上次在 2019 年出现的活动的这个问题的 FIFO:使用 systemd 的 Exec* 命令将命令传递给进程
根据这些日志,我的理解是,我向 FIFO 发出的命令实际上并没有与正确的进程对话。以下是运行过程中的一些示例日志systemctl status minecraft-server
:
Oct 26 18:33:59 mc-server bash[1589]: [2021-10-26 18:33:59:697 INFO] Game mode: 0 Survival
Oct 26 18:33:59 mc-server bash[1589]: [2021-10-26 18:33:59:697 INFO] Difficulty: 1 EASY
Oct 26 18:33:59 mc-server bash[1589]: [INFO] opening worlds/Bedrock level/db
Oct 26 18:33:59 mc-server bash[1589]: [INFO] IPv4 supported, port: 43885
Oct 26 18:33:59 mc-server bash[1589]: [INFO] IPv6 supported, port: 19133
Oct 26 18:34:00 mc-server bash[1589]: [INFO] Server started.
Oct 26 18:34:00 mc-server bash[1589]: [INFO] IPv4 supported, port: 19132
Oct 26 18:34:00 mc-server bash[1589]: [INFO] IPv6 supported, port: 39935
Oct 26 18:34:44 mc-server systemd[1]: Stopping Minecraft Bedrock Server 1.17.x.x...
Oct 26 18:34:44 mc-server bash[1618]: stop
最后一个日志项是通过 发出的命令systemctl stop minecraft-server
,但它什么也没做。事实上,根据进程 ID,它似乎根本没有被发送到正确的进程。
以下是我的相关单元文件。首先是我的 minecraft-server.service 文件:
[Unit]
Description=Minecraft Bedrock Server 1.17.x.x
After=network-up.target mnt-minecraft.mount
[Service]
WorkingDirectory=/mnt/minecraft
Environment=LD_LIBRARY_PATH=/mnt/minecraft/
KillSignal=SIGCONT
Sockets=minecraft-server.socket
ExecStart=/bin/bash -c "mkfifo minecraft-server.control; exec /mnt/minecraft/bedrock_server < /mnt/minecraft/minecraft-server.control"
ExecStop=/bin/bash -c "echo stop\n > /mnt/minecraft/minecraft-server.control"
[Install]
WantedBy=multi-user.target
在收到套接字启动时的一些错误消息后,我将mkfifo
命令包含在 ExecStart 参数中。这可能是也可能不是问题所在。
这是我的 minecraft-server.socket 文件:
[Unit]
BindsTo=minecraft-server.service
[Socket]
ListenFIFO=/mnt/minecraft/minecraft-server.control
FileDescriptorName=control
RemoveOnStop=true
有人能告诉我如何让我的 FIFO 正确输入到服务器进程中吗?
答案1
我解决了这个问题,因此我在这里发布了答案,供任何阅读的人参考。
在尝试重定向 stdin 后,我发现像echo "stop" < /mnt/minecraft/minecraft-server.control
(127) 这样的命令会因为操作符和 .control 文件之间的空格而失败。因此,echo "stop\n" </mnt/minecraft/minecraft-server.control
我得到了一个退出状态 0,并朝着正确的方向前进。
之后,服务器抱怨换行符,所以我重写了 ExecStop 参数并稍微修复了我的服务单元文件:
[Unit]
Description=Minecraft Bedrock Server 1.17.x.x
After=network-up.target mnt-minecraft.mount
[Service]
WorkingDirectory=/mnt/minecraft
Environment=LD_LIBRARY_PATH=/mnt/minecraft/
KillSignal=SIGCONT
Sockets=minecraft-server.socket
ExecStart=/bin/bash -c "mkfifo minecraft-server.control; exec /mnt/minecraft/bedrock_server </mnt/minecraft/minecraft-server.control"
ExecStop=/bin/bash -c "echo \"stop\" >/mnt/minecraft/minecraft-server.control"
[Install]
WantedBy=multi-user.target