JavaおよびPythonではSystemdサービスを使用できません。

JavaおよびPythonではSystemdサービスを使用できません。

VPSでDiscord音楽ボットを実行しており、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いえ、ある命令が別の命令の後に実行されるという意味ではありません。

Lavalink.jar始める前に終了したい場合は、launcher.service答えは簡単です。ExecStartPre=代わりにExecStart=forを使用してください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番目のサービスが早すぎるかもしれません。

より良い解決策は、Lavalink.jar監視デバイスを実装することです。その後Type=watchdog、これを行うことができますlavalink.service。これにより、launcher.serviceウォッチドッグがハートビートの受信を開始した後にのみ開始されますlavalink.service。これは素晴らしい代替品になりますExecStartPre=/bin/sleep

おすすめ記事