我在 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=watchdog
在lavalink.service
.这将导致launcher.service
仅在看门狗开始接收来自 的心跳后才启动lavalink.service
。这将是一个很好的替代品ExecStartPre=/bin/sleep
。
答案2
我不知道为什么 python 脚本不启动,但你必须使用命令:
/usr/bin/java -jar path/to/jar/file
来执行.jar
文件。