Java 및 Python에서는 Systemd 서비스를 사용할 수 없습니다.

Java 및 Python에서는 Systemd 서비스를 사용할 수 없습니다.

VPS에서 Discord 음악 봇을 실행하고 있으며 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대답은 간단합니다. ExecStartPre=대신에 ExecStart=for를 사용하세요 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 실행하려면 command: 를 사용해야 합니다..jar

관련 정보