유사한 서비스가 실행 중일 때 Systemd는 알림 PID를 무시합니다.

유사한 서비스가 실행 중일 때 Systemd는 알림 PID를 무시합니다.

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

관련 정보