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文件。

相关内容