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

问题描述 投票:0回答:1

我在我的Raspberry Pi 3上运行Raspbian GNU Linux(9)Stretch。

项目概况

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

Django Server使用:/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脚本。

但是,由于只允许一个ExecStart,我无法在同一个systemd服务中启动并运行我的Django服务器。我需要两个并行运行,但Django最先启动。

我想我正在寻找像Wants这样的东西。

我遇到了以下question,但我还没有设法实现一个有效的解决方案。但是大多数信息都是相关的。

如果你的单位文件中的Type = simple,你只能指定一个ExecStart,但你可以添加ExecStartPreExecStartPost,但这些都不适合长时间运行的命令,因为它们是串行执行的,一开始就被杀死所有下一个。如果Type=oneshot你可以指定多个ExecStart,它们不是并行连续运行。

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

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最先启动。

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

[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服务器不启动。

有关如何做到这一点的任何建议?

python linux raspberry-pi systemd boot
1个回答
1
投票

你需要的是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

© www.soinside.com 2019 - 2024. All rights reserved.