
私は 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
。