Systemd 服務不適用於 Java 與 Python

Systemd 服務不適用於 Java 與 Python

我在 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 那樣啟動。是的,我運行了這兩個命令:

sudo systemctl daemon-reload
sudo systemctl enable bot.service

如果有人知道發生了什麼,我真的很感激任何形式的幫助。

問候。

答案1

我懷疑這兩個ExecStart=命令將同時啟動。裡面什麼也沒有man systemd.service或者man systemd.exec表示它將等待其中一個退出,然後再啟動另一個,或等待一個處於某種穩定的內部狀態,然後再啟動另一個。

事實上,man systemd.service關於ExecStartPre=and明確地表達了這一點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因為在速度慢的一天,您的第二個服務可能會太早開始,而在速度快的一天,您的第二個服務不會盡快開始。

更好的解決方案是Lavalink.jar實施看門狗。然後你就可以Type=watchdoglavalink.service.這將導致launcher.service僅在看門狗開始接收來自 的心跳後才啟動lavalink.service。這將是一個很好的替代品ExecStartPre=/bin/sleep

答案2

我不知道為什麼 python 腳本不啟動,但你必須使用命令: /usr/bin/java -jar path/to/jar/file 來執行.jar檔。

相關內容