Служба Systemd не работает с Java и Python

Служба Systemd не работает с Java и Python

Я запускаю своего музыкального бота 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файлов нужно использовать команду:

Связанный контент