
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.service
oderman systemd.exec
um 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.service
wird 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=oneshot
aber nicht, dass einer nach dem anderen ausgeführt wird.
Wenn Sie Lavalink.jar
vor 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.py
sie von abhängig sind Lavalink.jar
und 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, sleep
da 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.jar
der Watchdog implementiert würde. Dann könnten Sie Type=watchdog
in verwenden lavalink.service
. Das würde bewirken, launcher.service
dass 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