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