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

时间:2018-09-03 10:03:58

标签: python linux raspberry-pi systemd boot

我正在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.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 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以在一个单元中尝试

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