El servicio Systemd no funciona con Java y Python

El servicio Systemd no funciona con Java y Python

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.serviceoman systemd.execsugerir 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.servicedice 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=oneshotpero no dice que uno se ejecutará después del otro.

Si desea Lavalink.jarsalir antes de comenzar, launcher.servicela respuesta es simple: use ExecStartPre=en lugar de ExecStart=for Lavalink.jar.

De lo contrario, si launcher.pydepende de Lavalink.jarellos 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 sleepporque 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.jarimplementar el organismo de control. Entonces podrías usarlo Type=watchdogen lavalink.service. Eso haría que launcher.servicecomenzara 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 .jararchivos.

información relacionada