
Estoy ejecutando mi Discord Music Bot en un VPS, y para iniciar el bot como lo hace el VPS, tengo un servicio llamado "bot.service" (ubicado en /etc/systemd/system), que tiene lo siguiente:
[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
Pero no funciona, el bot no arranca como lo hace el VPS. Y sí, ejecuté estos dos comandos:
sudo systemctl daemon-reload
sudo systemctl enable bot.service
Si alguien sabe lo que está pasando, agradecería mucho cualquier tipo de ayuda.
Saludos.
Respuesta1
Sospecho que ambos ExecStart=
comandos se iniciarán simultáneamente. no hay nada enman systemd.service
oman systemd.exec
sugerir que esperará a que uno salga antes de que el otro comience o esperará a que uno esté en algún estado interno estable antes de iniciar el otro.
De hecho, man systemd.service
dice explícitamente esto sobre ExecStartPre=
y ExecStartPost=
:
La sintaxis es la misma que para ExecStart=, excepto que se permiten múltiples líneas de comando y los comandos se ejecutan uno tras otro.
ExecStart=
dice que se permiten múltiples comandos Type=oneshot
pero no dice que uno se ejecutará después del otro.
Si desea Lavalink.jar
salir antes de comenzar, launcher.service
la respuesta es simple: use ExecStartPre=
en lugar de ExecStart=
for Lavalink.jar
.
De lo contrario, si launcher.py
depende de Lavalink.jar
ellos y son servicios de larga duración, entonces podría ser una mejor idea dividirlos en servicios separados de esta manera:
# 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 no me gusta sleep
porque en un día lento, su segundo servicio puede comenzar demasiado temprano, y en un día rápido, su segundo servicio no comienza lo antes posible.
Una mejor solución sería Lavalink.jar
implementar el organismo de control. Entonces podrías usarlo Type=watchdog
en lavalink.service
. Eso haría que launcher.service
comenzara solo después de que el perro guardián comience a recibir un latido del corazón lavalink.service
. Este sería un buen reemplazo para ExecStartPre=/bin/sleep
.
Respuesta2
No sé por qué el script de Python no se inicia, pero debes usar el comando:
/usr/bin/java -jar path/to/jar/file
para ejecutar los .jar
archivos.