Выполнение нескольких скриптов Python в определенном порядке с использованием systemd

Я использую 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 находится по адресу: /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.

Думаю ищу что-то вроде Хочет.

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

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.

Вот почему я отредактировал 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 - нет.

Есть предложения, как это можно сделать?

Учитывая, что это две разные службы, почему бы просто не использовать два разных файла модулей?

Kendas 03.09.2018 12:12

Как мне выполнить их в определенном порядке при запуске?

rrz0 03.09.2018 12:17

Вы можете указать зависимости в единицах systemd.

syntonym 03.09.2018 12:19

Stack Overflow - это сайт для вопросов по программированию и разработке. Этот вопрос кажется не по теме, потому что он не о программировании или разработке. См. О каких темах я могу спросить здесь в Справочном центре. Возможно, лучше спросить Суперпользователь или Обмен стеков Unix и Linux.

jww 03.09.2018 12:47

Спасибо @jww, буду иметь это в виду на будущее.

rrz0 03.09.2018 12:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
2 349
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужны 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

Также хорошо будет указать RequiredBy в модуле DjangoService

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

Ах, спасибо, я только что отредактировал свой вопрос, думая, что мне нужно что-то вроде Wants. Я попробую это и вернусь. Согласно следующему сайту, мне может потребоваться использовать Wants, поскольку я хочу, чтобы мой скрипт python запускался даже при возникновении проблемы с Django. fedoramagazine.org/systemd-unit-dependencies-and-order

rrz0 03.09.2018 12:37

Хорошо, если ваш скрипт python не зависит от успешного запуска службы django, вам нужен Wants, а не Requires. Я бы посоветовал дать им удобное имя службы имен.

rajeshnair 03.09.2018 12:47

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

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

Другие вопросы по теме