更新:
仍然有这个问题。我注意到,当我运行“systemctl start minecraft.service”时,我的 systemd 服务正在按顺序运行 ExecStart 和 ExecStop 命令。我已经从 tmux 控制台的输出和 systemd 状态验证了这一点,如下所示。因此它正确地调用了 mc_server.sh 脚本,但我无法让它停止调用“ExecStop”命令。我尝试过删除 Type= 设置(默认为 simple),直接将 Type 更改为 simple,但这些似乎都无法解决问题。
原始问题:
我最近升级到了 18.04.1,但无法让我的 Minecraft systemd 服务再次运行。我从 16.04 全新安装了 18.04。此服务在 16.04 上正常运行,但现在似乎无法正常工作。当我运行“systemctl start minecraft.service”时,根据下面的状态输出,它似乎会同时运行 ExecStart 脚本和 ExecStop 脚本,但我没有在 tmux 控制台中看到它应该运行的脚本的任何输出。如果我手动调用启动脚本,它可以正常工作,因此 systemd 服务中存在问题。
该服务设置为以 minecraft 用户身份在 minecraft 组下运行。/srv/minecraft 中的所有内容均归 minecraft 用户/组所有。minecraft.service 文件归 root 所有。所有这些都与 16.04 运行时相同。如果您有任何让它再次运行的想法,请告诉我!谢谢!!
:/etc/systemd/system$ systemctl status minecraft.service
● minecraft.service - Minecraft Server
Loaded: loaded (/etc/systemd/system/minecraft.service; enabled; vendor
preset
Active: inactive (dead) since Wed 2018-11-14 16:33:25 PST; 3s ago
Process: 4667 ExecStop=/srv/minecraft/mc_server.sh stop (code=exited,
status=0/SUCCESS)
Process: 4651 ExecStart=/srv/minecraft/mc_server.sh start (code=exited,
status=0/SUCCESS)
Nov 14 16:33:11 systemd[1]: Starting Minecraft Server...
Nov 14 16:33:11 mc_server.sh[4651]: Session found. Connecting.
Nov 14 16:33:11 mc_server.sh[4651]: Minecraft server successfully
started
Nov 14 16:33:11 mc_server.sh[4667]: step 1 successs
Nov 14 16:33:19 mc_server.sh[4667]: step 2 success
Nov 14 16:33:21 mc_server.sh[4667]: server shutdown success
Nov 14 16:33:25 systemd[1]: Started Minecraft Server.
以下是 systemd 脚本:
# Source: https://github.com/agowa338/MinecraftSystemdUnit/
# License: MIT
[Unit]
Description=Minecraft Server
After=network.target auditd.service
[Service]
WorkingDirectory=/srv/minecraft/
# PrivateUsers=true
User=minecraft
Group=minecraft
ProtectSystem=full
ProtectHome=true
# ProtectKernelTunables=true
# Implies MountFlags=slave
# ProtectKernelModules=true
# Implies NoNewPrivileges=yes
# ProtectControlGroups=true
# Implies MountAPIVFS=yes
Type=forking
ExecStart=/srv/minecraft/mc_server.sh start
ExecStop=/srv/minecraft/mc_server.sh stop
Restart=on-abnormal
RestartSec=60s
[Install]
WantedBy=multi-user.target
答案1
好的,我明白了。下面是我为使这项服务重新运行所采取的措施。
添加指令“RemainAfterExit=yes”似乎解决了 ExecStop 命令在启动命令后立即运行的问题。这有点奇怪,因为在 16.04 中使用相同的设置,当 Type 设置为 forking 时,我不需要 RemainAfterExit 选项。但显然现在你需要它?
如果有人遇到类似的问题,这里是我当前的 systemd Unit 文件:
# Source: https://github.com/agowa338/MinecraftSystemdUnit/
# License: MIT
[Unit]
Description=Minecraft Server
After=network.target
[Service]
User=minecraft
Group=minecraft
WorkingDirectory=~
Type=simple
RemainAfterExit=yes
PIDFile=/srv/minecraft/minecraft_process.pid
ExecStart=/srv/minecraft/mc_server.sh start
ExecStop=/srv/minecraft/mc_server.sh stop
[Install]
WantedBy=multi-user.target
答案2
这可能不是您的 systemd,但可能是它调用的脚本出现了问题。
/srv/minecraft/mc_server.sh
您是否尝试过直接运行它并且有效?
正常情况下这应该可以工作,因为我没有看到你的脚本调用 tmux,它应该是这样的。
tmux new -s my_session
run your command to start the server
tmux detach