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
。