Я использую Raspbian GNU Linux (9) Stretch на своем Raspberry Pi 3.
Сервер 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 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=oneshotyou 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.
Вот почему я отредактировал 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 - это сайт для вопросов по программированию и разработке. Этот вопрос кажется не по теме, потому что он не о программировании или разработке. См. О каких темах я могу спросить здесь в Справочном центре. Возможно, лучше спросить Суперпользователь или Обмен стеков Unix и Linux.
Спасибо @jww, буду иметь это в виду на будущее.






Вам нужны 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
Хорошо, если ваш скрипт python не зависит от успешного запуска службы django, вам нужен Wants, а не Requires. Я бы посоветовал дать им удобное имя службы имен.
Вы можете попробовать это на одном устройстве
ExecStart=sh -c "python script1.py & python script2.py"
Учитывая, что это две разные службы, почему бы просто не использовать два разных файла модулей?