Systemd-Dienst funktioniert nicht mit Java und Python

Systemd-Dienst funktioniert nicht mit Java und Python

Ich lasse meinen Discord Music Bot auf einem VPS laufen und um den Bot wie der VPS zu starten, habe ich einen Dienst namens „bot.service“ (angeordnet in /etc/systemd/system), der Folgendes hat:

[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

Aber es funktioniert nicht, der Bot startet nicht wie der VPS. Und ja, ich habe diese beiden Befehle ausgeführt:

sudo systemctl daemon-reload
sudo systemctl enable bot.service

Wenn jemand weiß, was passiert, wäre ich für jede Art von Hilfe sehr dankbar.

Grüße.

Antwort1

Ich vermute, dass beide ExecStart=Befehle gleichzeitig gestartet werden. Es gibt nichts inman systemd.serviceoderman systemd.execum anzudeuten, dass es wartet, bis eines beendet wird, bevor das andere gestartet wird, oder dass es wartet, bis sich eines in einem stabilen internen Zustand befindet, bevor das andere gestartet wird.

Tatsächlich man systemd.servicewird dies über ExecStartPre=und ausdrücklich gesagt ExecStartPost=:

Die Syntax ist dieselbe wie bei ExecStart=, außer dass mehrere Befehlszeilen zulässig sind und die Befehle nacheinander ausgeführt werden.

ExecStart=besagt zwar, dass mehrere Befehle zulässig sind, Type=oneshotaber nicht, dass einer nach dem anderen ausgeführt wird.

Wenn Sie Lavalink.jarvor dem Start beenden möchten launcher.service, ist die Antwort einfach: Verwenden Sie ExecStartPre=anstelle von ExecStart=for Lavalink.jar.

Andernfalls ist es möglicherweise eine bessere Idee, sie in separate Dienste aufzuteilen, wenn launcher.pysie von abhängig sind Lavalink.jarund es sich um Dienste mit langer Laufzeit handelt, wie folgt:

# 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

Normalerweise mag ich das nicht, sleepda an einem ruhigen Tag Ihr zweiter Aufschlag möglicherweise zu früh beginnt und an einem schnellen Tag Ihr zweiter Aufschlag nicht so bald wie möglich beginnt.

Eine bessere Lösung wäre, wenn Lavalink.jarder Watchdog implementiert würde. Dann könnten Sie Type=watchdogin verwenden lavalink.service. Das würde bewirken, launcher.servicedass er erst startet, nachdem der Watchdog ein Heartbateat von empfängt lavalink.service. Das wäre ein guter Ersatz für ExecStartPre=/bin/sleep.

Antwort2

Ich weiß nicht, warum das Python-Skript nicht startet, aber Sie müssen den Befehl verwenden: um die Dateien /usr/bin/java -jar path/to/jar/file auszuführen ..jar

verwandte Informationen