서버를 자동으로 시작하고 명령을 전달할 수 있도록 systemd 서비스를 어떻게 설정해야 합니까?

서버를 자동으로 시작하고 명령을 전달할 수 있도록 systemd 서비스를 어떻게 설정해야 합니까?

표적:

Fedora에서 systemd를 사용하여 컴퓨터 시작 시 Minecraft 서버를 실행하려고 합니다. 서버를 적절하게 관리하기 위해 충족해야 하는 몇 가지 자체 기준이 있습니다.

  1. minecraft내 홈 디렉토리를 사용하여 생성한 시스템 사용자로 실행 해야 합니다 /opt/minecraft. 나는 addusering을 전달한 다음 행을 추가하려고 시도했습니다 User=minecraft.WorkingDirectory=/opt/minecraft/
  2. 확장 가능해야 하며 모든 수의 서버에서 작동해야 합니다. 템플릿 서비스를 사용해 보고 디렉토리를 전달할 수 있도록 WorkingDirectory줄 을 변경했습니다.WorkingDirectory=/opt/minecraft/%i
  3. 어떻게든 명령을 전달할 수 있어야 합니다. 그것이 바로 제가 옹호하는 것입니다. 소켓 장치를 사용해 본 다음 연결해 보았지만 /run/minecraft%I제대로 작동하지 않습니다. Minecraft 서버를 처음 사용하는 경우 명령을 전달할 수 있는 대화형 콘솔이 있습니다. 예전에는 세션 tmux send으로 구동되는 서버를 사용해봤는데 tmux문제는 자동으로 시작되지 않고 고급스러운 느낌도 안난다는 점입니다.

시도해 볼 수 있는 솔루션:

/usr/local/lib/systemd/system/[email protected]:

[Unit]
Description=Minecraft server: %i

# only run after networking is ready
After=network-online.target
Wants=network-online.target

[Service]
Type=simple

# restart if the server crashes
Restart=on-failure
RestartSec=5s

# set the input and outputs to a socket unit and the journal resp.
Sockets=minecraft@%i.socket
StandardInput=socket                     
StandardOutput=journal
StandardError=journal

# set the user and directory to the correct values
User=minecraft
WorkingDirectory=/opt/minecraft/%i/

# run the start script for the specified server
ExecStart=/bin/bash /opt/minecraft/%i/start.sh

[Install]
WantedBy=default.target

/usr/local/lib/systemd/system/[email protected]:

[Unit]
Description=Socket for Minecraft server: %i

[Socket]
# listen to a pipe for input
ListenFIFO=%t/minecraft%I.stdin

Service=minecraft@%i.service

질문:

서버를 시작 하려고 하면 sudo systemctl start minecraft@1_17_1.service(서버가 설치된 경우 /opt/minecraft/1_17_1/) 실패합니다.

Job for minecraft@1_17_1.service failed because of unavailable resources or another system error.
See "systemctl status minecraft@1_17_1.service" and "journalctl -xeu minecraft@1_17_1.service" for details.

이로 인해 다음을 실행하라는 메시지가 표시되었습니다 systemctl status minecraft@1_17_1.service.

● minecraft@1_17_1.service - Minecraft server: 1_17_1
     Loaded: loaded (/usr/local/lib/systemd/system/[email protected]; enabled; vendor preset: disabled)
     Active: activating (auto-restart) (Result: resources) since Thu 2021-11-04 14:37:27 EDT; 163ms ago
TriggeredBy: × minecraft@1_17_1.socket
        CPU: 0

그리고journalctl -xeu minecraft@1_17_1.service

Nov 04 14:51:01 riley-fedora systemd[1]: minecraft@1_17_1.service: Got no socket.
Nov 04 14:51:01 riley-fedora systemd[1]: minecraft@1_17_1.service: Failed to run 'start' task: Invalid argument
Nov 04 14:51:01 riley-fedora systemd[1]: minecraft@1_17_1.service: Failed with result 'resources'.
░░ Subject: Unit failed
░░ Defined-By: systemd
░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
░░ 
░░ The unit minecraft@1_17_1.service has entered the 'failed' state with result 'resources'.
Nov 04 14:51:01 riley-fedora systemd[1]: Failed to start Minecraft server: 1_17_1.
░░ Subject: A start job for unit minecraft@1_17_1.service has failed
░░ Defined-By: systemd
░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
░░ 
░░ A start job for unit minecraft@1_17_1.service has finished with a failure.
░░ 
░░ The job identifier is 55890 and the job result is failed.

내 파일에 화가 난 것 같아서 [email protected]다음을 실행했습니다 systemctl status minecraft@1_17_1.socket.

× minecraft@1_17_1.socket - Socket for Minecraft server: 1_17_1
     Loaded: loaded (/usr/local/lib/systemd/system/[email protected]; static)
     Active: failed (Result: resources)
   Triggers: ● minecraft@1_17_1.service
     Listen: /run/minecraft1_17_1.stdin (FIFO)

Nov 04 14:52:35 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed with result 'resources'.
Nov 04 14:52:35 riley-fedora systemd[1]: Failed to listen on Socket for Minecraft server: 1_17_1.
Nov 04 14:52:41 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed to open FIFO /run/minecraft1_17_1.stdin: Permission denied
Nov 04 14:52:41 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed to listen on sockets: Permission denied
Nov 04 14:52:41 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed with result 'resources'.
Nov 04 14:52:41 riley-fedora systemd[1]: Failed to listen on Socket for Minecraft server: 1_17_1.
Nov 04 14:52:46 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed to open FIFO /run/minecraft1_17_1.stdin: Permission denied
Nov 04 14:52:46 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed to listen on sockets: Permission denied
Nov 04 14:52:46 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed with result 'resources'.
Nov 04 14:52:46 riley-fedora systemd[1]: Failed to listen on Socket for Minecraft server: 1_17_1.

그래서 문제는 내가 사용하고 있는 파이프의 권한과 관련된 것 같습니다.

좋은 측정을 위해 나는 달렸다journalctl -xeu minecraft@1_17_1.socket

Nov 04 14:52:46 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed to open FIFO /run/minecraft1_17_1.stdin: Permission denied
Nov 04 14:52:46 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed to listen on sockets: Permission denied
Nov 04 14:52:46 riley-fedora systemd[1]: minecraft@1_17_1.socket: Failed with result 'resources'.
░░ Subject: Unit failed
░░ Defined-By: systemd
░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
░░ 
░░ The unit minecraft@1_17_1.socket has entered the 'failed' state with result 'resources'.
Nov 04 14:52:46 riley-fedora systemd[1]: Failed to listen on Socket for Minecraft server: 1_17_1.
░░ Subject: A start job for unit minecraft@1_17_1.socket has failed
░░ Defined-By: systemd
░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
░░ 
░░ A start job for unit minecraft@1_17_1.socket has finished with a failure.
░░ 
░░ The job identifier is 58598 and the job result is failed.

질문:

내가 뭘 잘못했나요? 4시간 정도 걸렸어요바지구글의 두 번째, 세 번째, 심지어 네 번째 페이지에도 해결책이 없습니다. 나는 여기서 헤매고 있으므로 모든 도움에 크게 감사드립니다.

답변1

문제를 재현할 수 없기 때문에 완전한 답변을 드릴 수 없습니다. 하지만 검증 가능한 최소한의 예를 구성하려고 노력했고 몇 가지 문제 해결 아이디어를 생각해 냈습니다.

# /etc/systemd/system/[email protected]
[Service]
ExecStart=cat -
User=stew
Sockets=sockinst@%i.socket
StandardInput=socket
StandardOutput=journal
StandardError=journal
# /etc/systemd/system/[email protected]
[Socket]
ListenFIFO=%t/sockinst%I.stdin
Service=sockinst@%i.service

그런 다음 실행하면 작동합니다.

stew /etc/systemd/system $ systemctl start sockinst@1_1.service
stew /etc/systemd/system $ echo "Hello" > /run/sockinst1_1.stdin 
stew /etc/systemd/system $ systemctl status sockinst@1_1.{service,socket}
● sockinst@1_1.service - Testing instanced sockets 1_1
     Loaded: loaded (/etc/systemd/system/[email protected]; static)
     Active: active (running) since Fri 2021-11-05 10:35:41 CET; 37s ago
TriggeredBy: ● sockinst@1_1.socket

systemd[1]: Started Testing instanced sockets 1_1.
cat[11623]: Hello

● sockinst@1_1.socket - Socket for instance 1_1
     Loaded: loaded (/etc/systemd/system/[email protected]; static)
     Active: active (running) since Fri 2021-11-05 10:35:41 CET; 37s ago
   Triggers: ● sockinst@1_1.service
     Listen: /run/sockinst1_1.stdin (FIFO)

systemd[1]: Listening on Socket for instance 1_1.

여기에서 접할 수 있는 몇 가지 팁은 다음과 같습니다.

  1. 이렇게 하면 systemctl stop minecraft@1_17_1.service병렬 소켓이 중지되지 않습니다. 이는 /run/minecraft1_17_1.stdin계속해서 실행된다는 것을 의미합니다 . 실제로 이렇게 하면 echo "hello" > /run/minecraft1_17_1.stdin서비스가 시작됩니다. 서비스 문제를 해결하는 경우 오래된 소켓이 테스트에 영향을 줄 수 있다고 생각합니다. 다음 두 가지 옵션 중 하나를 선택하는 것이 좋습니다.

    1. 그걸 이용 systemctl stop minecrat@1_17_1.{service,socket}해서 막고,
    2. 소켓 섹션 PartOf=minecraft@%i.service에 추가되었습니다 . [Unit]이로 인해 서비스가 중지되면 자동으로 중지됩니다.
  2. 당신은 을 사용하고 있습니다 Restart=on-failure. 이는 최종 결과에는 좋지만 초기 실패를 가릴 수 있습니다. 문제를 해결하는 동안 일시적으로 제거해 보세요. 그런 다음 실패하면 실패의 원래 이유를 확인할 수 있습니다. 내 생각엔 서버 시작에 합법적인 문제가 있는 것 같지만 소켓은 첫 번째 인스턴스에 바인딩되어 있습니다. 그런 다음 재부팅할 때마다 ExecStart=를 시도하기 전에 이전 소켓에 바인딩하지 못하므로 처음부터 실패한 이유를 알 수 없습니다. 서비스와 소켓을 반드시 중지한 후 시작하고 즉시 출력을 확인하세요. 오류 메시지가 달라도 놀라지 않을 것입니다.

  3. Minecraft 서버에 그래픽 사용자 인터페이스가 있다고 설명하셨습니다. 이는 선택 사항이며 갑자기 귀하 DISPLAYXAUTHORITY귀하가 설정하는 내용에 따라 달라집니다. 이로 인해 깨질 수 있는 많은 것들이 발생합니다. 서비스 담당자에게 연락하여 초기 실패의 가능한 원인을 nogui제거 하도록 선택하십시오 . 정말로 해당 GUI를 원한다면 start.sh스크립트에서 환경 변수 DISPLAY를 설정해야 합니다 XAUTHORITY(그러나 이것이 반드시 가장 쉬운 일은 아닙니다). 서비스를 실행할 수 있는지 확인하려면 최소한 GUI 없이 시도해 볼 것을 권장합니다.

  4. sudo systemctl daemon-reload파일을 편집하는 동안 실행하는 것을 잊어 버릴 수도 있습니다 . 참고로 systemd가 각 장치의 최신 버전을 읽을 수 있도록 이 명령을 실행해야 합니다.

관련 정보