Java 및 Python에서 작동하지 않는 시스템 서비스

Java 및 Python에서 작동하지 않는 시스템 서비스

VPS에서 Discord Music Bot을 실행하고 있으며 VPS처럼 봇을 시작하려면 다음과 같은 "bot.service"(/etc/systemd/system에 위치)라는 서비스가 있습니다.

[Unit]
Description=blah blah

[Service]
ExecStart=/usr/bin/java /usr/java/Lavalink.jar #THIS SHOULD START FIRST
ExecStart=/usr/bin/python3 /home/launcher.py #THEN THIS
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

하지만 작동하지 않습니다. 봇은 VPS처럼 시작되지 않습니다. 네, 저는 이 두 가지 명령을 실행했습니다.

sudo systemctl daemon-reload
sudo systemctl enable bot.service

누군가 무슨 일이 일어나고 있는지 알고 있다면 어떤 종류의 도움이라도 정말 감사하겠습니다.

문안 인사.

답변1

ExecStart=두 명령이 동시에 시작될 것으로 생각됩니다 . 아무것도 없습니다man systemd.service또는man systemd.exec다른 하나가 시작되기 전에 하나가 종료될 때까지 기다리거나 다른 하나를 시작하기 전에 하나가 일정한 내부 상태에 있을 때까지 기다릴 것임을 제안합니다.

실제로 및에 man systemd.service대해 다음과 같이 명시적으로 말합니다 .ExecStartPre=ExecStartPost=

여러 명령줄이 허용되고 명령이 차례로 실행된다는 점을 제외하면 구문은 ExecStart=와 동일합니다.

ExecStart=여러 명령이 허용된다고 말하지만 Type=oneshot하나가 다른 명령 후에 실행된다는 말은 없습니다.

Lavalink.jar시작하기 전에 종료 하려면 launcher.service대답은 간단합니다. for ExecStartPre=대신 사용하십시오 .ExecStart=Lavalink.jar

그렇지 않고 장기 실행 서비스 launcher.py에 의존하는 경우 다음과 같이 별도의 서비스로 분할하는 것이 더 나을 수 있습니다.Lavalink.jar

# lavalink.service
[Service]
ExecStart=/usr/bin/java -jar /usr/java/Lavalink.jar
# launcher.service
[Unit]
After=lavalink.service
Requires=lavalink.service

[Service]
ExecStartPre=/bin/sleep 10
ExecStart=/usr/bin/python3 /home/launcher.py

[Install]
WantedBy=multi-user.target

sleep나는 보통 느린 날에는 두 번째 서비스가 너무 일찍 시작될 수 있고, 빠른 날에는 두 번째 서비스가 가능한 한 빨리 시작되지 않기 때문에 좋아하지 않습니다 .

더 나은 해결책은 Lavalink.jar감시 장치를 구현하는 것입니다. 그런 다음 Type=watchdog에서 사용할 수 있습니다 lavalink.service. 이는 launcher.service감시자가 에서 하트비트를 수신하기 시작한 후에만 시작 됩니다 lavalink.service. 이것은 좋은 대체품이 될 것입니다 ExecStartPre=/bin/sleep.

답변2

Python 스크립트가 시작되지 않는 이유는 모르겠지만 파일을 /usr/bin/java -jar path/to/jar/file 실행하려면 다음 명령을 사용해야 합니다 .jar.

관련 정보