【问题标题】:Executing multiple Python scripts in a particular order using systemd使用 systemd 以特定顺序执行多个 Python 脚本
【发布时间】:2019-02-08 09:03:01
【问题描述】:

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

项目概述

  1. 使用 Pi 的 2 个输入的 Python 脚本。根据这些输入执行计算,并将值存储在数据库中。
  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 脚本。

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

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

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

如果在你的单元文件中Type=simple,你只能指定一个ExecStart,但你可以添加尽可能多的ExecStartPre,ExecStartPost,但是这些都不适合长时间运行的命令,因为它们会被执行连续地,在开始下一个之前,所有一个开始都被杀死。如果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服务器未启动。

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

【问题讨论】:

  • 鉴于这是两个不同的服务,为什么不直接使用两个不同的单元文件呢?
  • 如何在启动时按特定顺序执行它们?
  • 您可以在 systemd 单元中指定依赖关系。
  • Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super UserUnix & Linux Stack Exchange 会是一个更好的提问地点。
  • 谢谢@jww,我会记住这一点以备将来使用。

标签: python linux raspberry-pi systemd boot


【解决方案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

【讨论】:

  • 啊,谢谢我刚刚编辑了我的问题,认为我需要像Wants 这样的东西。我会试试这个然后回来。根据以下站点,我可能需要使用Wants,因为即使 Django 出现问题,我也希望我的 python 脚本能够运行。 fedoramagazine.org/systemd-unit-dependencies-and-order
  • 好的,如果你的python脚本不依赖于django服务的成功启动,你需要Wants而不是Requires。我建议给他们一个有用的名称服务名称。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 2021-02-13
    • 2020-07-20
    • 2016-02-01
    • 2023-02-06
    • 2017-09-01
    相关资源
    最近更新 更多