
Я запускаю своего музыкального бота Discord на VPS, и для запуска бота так же, как это делает 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
к запуску только после того, как сторожевой таймер начал получать heartbaeat от lavalink.service
. Это было бы хорошей заменой для ExecStartPre=/bin/sleep
.
решение2
/usr/bin/java -jar path/to/jar/file
Я не знаю, почему скрипт Python не запускается, но для выполнения .jar
файлов нужно использовать команду: