使用 systemd 按特定顺序执行多个 Python 脚本
Executing multiple Python scripts in a particular order using systemd
我正在 运行ning Raspbian GNU Linux (9) Stretch,在我的 Raspberry Pi 3.
项目概览
- Python 脚本,它使用 2 个输入到 Pi。根据这些输入执行计算,并将值存储在数据库中。
- 一个单独的 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"
我正在 运行ning Raspbian GNU Linux (9) Stretch,在我的 Raspberry Pi 3.
项目概览
- Python 脚本,它使用 2 个输入到 Pi。根据这些输入执行计算,并将值存储在数据库中。
- 一个单独的 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 manyExecStartPre
,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. IfType=oneshot
you can specify multipleExecStart
, 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"