Serviço Systemd não funciona com Java e Python

Serviço Systemd não funciona com Java e Python

Estou executando meu Discord Music Bot em um VPS e, para iniciar o bot como o VPS faz, tenho um serviço chamado "bot.service" (localizado em /etc/systemd/system), que possui o seguinte:

[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

Mas não funciona, o bot não inicia como o VPS. E sim, executei estes dois comandos:

sudo systemctl daemon-reload
sudo systemctl enable bot.service

Se alguém souber o que está acontecendo, eu realmente aprecio qualquer tipo de ajuda.

Cumprimentos.

Responder1

Suspeito que ambos ExecStart=os comandos serão iniciados simultaneamente. Não há nada emman systemd.serviceouman systemd.execpara sugerir que ele esperará que um saia antes que o outro comece ou que um esteja em algum estado interno estável antes de iniciar o outro.

Na verdade, man systemd.servicediz explicitamente isso sobre ExecStartPre=e ExecStartPost=:

A sintaxe é a mesma de ExecStart=, exceto que múltiplas linhas de comando são permitidas e os comandos são executados um após o outro.

ExecStart=diz que vários comandos são permitidos, Type=oneshotmas não diz que um será executado após o outro.

Se você quiser Lavalink.jarsair antes de começar launcher.servicea resposta é simples: use ExecStartPre=em vez de ExecStart=for Lavalink.jar.

Caso contrário, se launcher.pydependerem Lavalink.jare forem serviços de longa duração, talvez seja uma ideia melhor dividi-los em serviços separados, como este:

# 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

Normalmente não gosto sleepporque em um dia lento, seu segundo culto pode começar muito cedo e, em um dia rápido, seu segundo culto não começa o mais rápido possível.

Uma solução melhor seria Lavalink.jarimplementar o watchdog. Então você poderia usar Type=watchdogin lavalink.service. Isso faria com launcher.serviceque ele iniciasse somente depois que o cão de guarda começasse a receber um batimento cardíaco de lavalink.service. Este seria um bom substituto para ExecStartPre=/bin/sleep.

Responder2

Não sei porque o script python não inicia, mas você tem que usar o comando: /usr/bin/java -jar path/to/jar/file para executar os .jararquivos.

informação relacionada