使用 systemd 按特定顺序执行多个 Python 脚本

Executing multiple Python scripts in a particular order using systemd

我正在 运行ning Raspbian GNU Linux (9) Stretch,在我的 Raspberry Pi 3.

项目概览

  1. Python 脚本,它使用 2 个输入到 Pi。根据这些输入执行计算,并将值存储在数据库中。
  2. 一个单独的 Django 网站,它从该数据库中读取值并更新网页内容。

Django 服务器 运行 使用:/home/pi/mysite/manage.py runserver 127.0.0.1:8000

Python 脚本 位于:/home/pi/Desktop/myscript.py

启动时,我想首先确保我的 Django 服务器已启动并且 运行正在运行,然后启动我的 python 脚本。

到目前为止我做了什么

最初我试图在启动时将 python 脚本设置为 运行。为此,我使用了一个简单的 systemd 服务,如下所示。

[Unit]
Description=My script

[Service]
ExecStart=/usr/bin/python3 /home/pi/Desktop/myscript.py

[Install]
WantedBy=multi-user.target

这 运行 没有错误并在启动时启动 python 脚本。

但是,我无法在同一个 systemd 服务中启动我的 Django 服务器和 运行ning,因为只允许一个 ExecStart。我需要两者并行 运行,但首先启动 Django。

我想我正在寻找类似 Wants 的东西。

我遇到了以下 ,但我还没有设法实施有效的解决方案。然而,大部分信息都是相关的。

if Type=simple in your unit file, you can only specify one ExecStart, but you can add as many ExecStartPre,ExecStartPost, but none of this is suited for long running commands, because they are executed serially and everything one start is killed before starting the next one. If Type=oneshot you can specify multiple ExecStart, they run serially not in parallel.

我尝试创建另一个单元如下:

sudo systemctl edit --force mysite.service


[Unit]
Description=my site

[Service]
ExecStart=/usr/bin/python /home/pi/mysite/manage.py runserver 127.0.0.1:8000

[Install]
WantedBy=multi-user.target

它可以独立运行。

但是我需要两者并行运行,但Django up 会先启动。

这就是我编辑 myscript.service 如下的原因:

[Unit]
Description=My script

[Service]
ExecStart=/usr/bin/python3 /home/pi/Desktop/Scripts/oee_calc.py
Wants=mysite.service

[Install]
WantedBy=multi-user.target

启动了python脚本,但是django服务器没有启动。

关于如何做到这一点有什么建议吗?

您需要的是 2 个不同的 systemd 单元并使用 requires

定义依赖关系
[Unit]
Description=My script

[Service]
ExecStart=/usr/bin/python3 /home/pi/Desktop/myscript.py
Requires=dhangioserver.service 

[Install]
WantedBy=multi-user.target

在DjangoService单元

中指定RequiredBy也会很好

有一个名为 Wants 的相关规范,其区别仅在于如果依赖关系失败,服务是否应该继续。查看您的要求,您似乎需要 Requires 而不是 Wants

你可以在一个单元中尝试这个

ExecStart=sh -c "python script1.py & python script2.py"