경로를 제외하면 거의 동일한 두 가지 서비스가 있습니다. 각 서비스는 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을 실행합니다.