Выполнение нескольких скриптов Python в определенном порядке с использованием systemd - PullRequest
0 голосов
/ 03 сентября 2018

Я использую 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 Script , расположенный по адресу: /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 должен запускаться первым.

Мне кажется, я ищу что-то вроде Хочет .

Я наткнулся на следующий вопрос , но мне не удалось реализовать работающее решение. Однако большая часть информации актуальна.

если в вашем модуле 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 - нет.

Любые предложения о том, как это можно сделать?

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Вы можете попробовать это в одном устройстве

ExecStart=sh -c "python script1.py & python script2.py" 
0 голосов
/ 03 сентября 2018

То, что вам нужно, - это 2 разных системных компонента, которые определяют зависимость с помощью requires

[Unit]
Description=My script

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

[Install]
WantedBy=multi-user.target

Также будет полезно указать RequiredBy в DjangoService unit

Существует связанная спецификация, называемая Wants, которая отличается только тем, должна ли служба продолжаться в случае сбоя зависимости или нет. Глядя на ваше требование, похоже, вам нужно Requires, а не Wants

...