我有两个几乎相同的服务,除了路径之外。每个服务都在 tmux 上运行一个 Minecraft 服务器。这是通用单元文件:
[Unit]
Description=<description>
After=network.target
[Service]
Type=notify
NotifyAccess=all
ExecStart=<Path to start script>
ExecStop=<path to stop script>
WorkingDirectory=<path to dir>
Restart=on-failure
RestartSec=120
User=<user>
[Install]
WantedBy=multi-user.target
启动脚本:
#!/bin/bash
SESSION_NAME=<name>
SERVER_JAR=<jar path>
MEMORY=<ram>
tmux new-session -d -s ${SESSION_NAME} 'java -Xms'"${MEMORY}"' -Xmx'"${MEMORY}"' -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:InitiatingHeapOccupancyPercent=15 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -Dpaper.playerconnection.keepalive=120 -Dsession_name='"${SESSION_NAME}"' -jar '"${SERVER_JAR}"' nogui'
main_pid=$(pgrep -a java | awk '/session_name='"${SESSION_NAME}"'/ {print $1}')
echo ${main_pid}
systemd-notify --ready --pid=${main_pid}
停止脚本:
#!/bin/bash
SESSION_NAME=<name>
# 10 second warning
echo "10 Second warning"
tmux send-keys -t ${SESSION_NAME} 'say "Server shutting down in 10 seconds"' ENTER
sleep 10 # wait 10 seconds
# Stop server
echo "Stopping server..."
tmux send-keys -t ${SESSION_NAME} 'stop' ENTER
# Wait for screen to terminate
while tmux ls | grep -q ${SESSION_NAME}
do
sleep 1
done
echo "Server stopped"
我有两个服务以完全相同的方式设置,但名称和路径不同。启动第一台服务器工作正常,并且它接收到正确的 PID。但是,当我启动第二个服务时,它立即退出并运行停止脚本。 Systemd 似乎忽略了第二个进程的 PID,即使它收到了通知消息(我可以通过 systemd-notify 设置状态)。只有当一项服务已经在运行时才会出现问题,无论我以哪种顺序启动它们,第二个服务总是会以这种方式失败。
我想知道为什么会发生这种情况,以及如何解决它。我宁愿继续使用启动/停止脚本,因为它更容易管理和设置新服务器,并且可以避免创建新服务器时使用 selinux 带来的一些麻烦。
我的系统是Rocky Linux 8.5,运行systemd 250