Systemd サービスが Java および Python で動作しない

Systemd サービスが Java および Python で動作しない

私は Discord Music Bot を VPS 上で実行しており、VPS と同じようにボットを起動するために、次の内容を持つ「bot.service」というサービス (/etc/systemd/system にあります) を用意しています。

[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

しかし、それは機能せず、ボットは VPS のように起動しません。はい、次の 2 つのコマンドを実行しました:

sudo systemctl daemon-reload
sudo systemctl enable bot.service

何が起こっているのか知っている人がいたら、どんな助けでもいただければ幸いです。

よろしくお願いいたします。

答え1

ExecStart=両方のコマンドが同時に開始されると思われます。man systemd.serviceまたはman systemd.execつまり、一方が終了するまで待ってからもう一方が開始するか、一方が何らかの安定した内部状態になるまで待ってからもう一方が開始することを示唆しています。

実際、は と についてman systemd.service次のように明示的に述べています。ExecStartPre=ExecStartPost=

構文は ExecStart= と同じですが、複数のコマンド ラインが許可され、コマンドが次々に実行される点が異なります。

ExecStart=複数のコマンドが許可されるとは書かれていますType=oneshotが、1 つのコマンドが他のコマンドの後に実行されるとは書かれていません。

Lavalink.jar開始する前に終了したい場合、launcher.service答えは簡単です。 forExecStartPre=の代わりにを使用します。ExecStart=Lavalink.jar

それ以外の場合、launcher.pyが に依存しておりLavalink.jar、それらが長時間実行されるサービスである場合は、次のようにそれらを別々のサービスに分割する方がよい場合があります。

# 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

通常は好きではありません。sleep閑散とした日には 2 回目の礼拝が早く始まる可能性があり、閑散とした日には 2 回目の礼拝ができるだけ早く始まらないからです。

Lavalink.jarウォッチドッグを実装すると、より良い解決策になります。その後、Type=watchdogで を使用できますlavalink.service。これにより、launcher.serviceウォッチドッグが からハートビートを受信し始めた後にのみ が起動するようになりますlavalink.service。これは の優れた代替品になりますExecStartPre=/bin/sleep

答え2

/usr/bin/java -jar path/to/jar/file Python スクリプトが起動しない理由はわかりませんが、ファイルを実行するにはコマンドを使用する必要があります .jar

関連情報