
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.service
ouman systemd.exec
para 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.service
diz 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=oneshot
mas não diz que um será executado após o outro.
Se você quiser Lavalink.jar
sair antes de começar launcher.service
a resposta é simples: use ExecStartPre=
em vez de ExecStart=
for Lavalink.jar
.
Caso contrário, se launcher.py
dependerem Lavalink.jar
e 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 sleep
porque 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.jar
implementar o watchdog. Então você poderia usar Type=watchdog
in lavalink.service
. Isso faria com launcher.service
que 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 .jar
arquivos.