Systemd Automation - запускать сценарий Python при загрузке через службу - PullRequest
1 голос
/ 23 января 2020

Я собрал скрипт автоматической проверки температуры, написанный на Python, который уведомляет меня, если он обнаруживает значение вне заданного диапазона, с намерением запустить его на безголовом Raspberry Pi. При исследовании того, как это сделать, быстро стало очевидно, что наиболее часто предлагаемый метод - это использование Systemd. К сожалению, я не смог воссоздать учебники, над которыми я работал большую часть дня, и решил, что пришло время обратиться за помощью.

Я не уверен, какую информацию предоставить здесь, так как Python скрипт работает совершенно нормально сам по себе. Тем не менее, это то, с чем я столкнулся при попытке создать службу:

[Unit]
Description=Temp Check Script
After=network.target

[Service]
ExecStart=/usr/bin/python3 -u TempCheck.py
WorkingDirectory=/home/pi/TempCheck
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi

[Install]
WantedBy=multi-user.target

А вот ошибки, которые я получаю при проверке статуса:

(code=exited, status=1/FAILURE)
Start request repeated too quickly.
Failed with result "exit-code"
Failed to start Temp Check Script

I ' Я старался изо всех сил задавать критические вопросы, делая это, чтобы лучше понять, что на самом деле означает каждая из этих вещей, но это первый день использования bash / systemd, поэтому, если вам интересно, почему именно я сделал конкретную вещь, ответ определенно будет либо невежество, либо потому что учебник сказал мне. Кстати, вот тот, на котором основана эта услуга -> https://www.raspberrypi.org/documentation/linux/usage/systemd.md

Большое спасибо за вашу помощь, я действительно ценю это!

Редактировать:

При запуске:

journalctl -u TempCheck.service

Я получаю несколько новых вещей, в том числе:

python3[404]: /usr/bin/python3 can't open file 'main.py': [Erno 2] No such file or directory
systemd[1]: TempCheck.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
systemd[1]: TempCheck.service: Failed with result 'exit-code'/
systemd[1]: TempCheck.service: Service RestartSec=100ms expired, scheduling restart.
systemd[1]: TempCheck.service: Scheduled restart job, restart counter is at 1.
systemd[1]: TempCheck.service: Stopped Temp Check Script
systemd[1]: TempCheck.service: Started Temp Check Script

Это повторяется несколько раз.

Я чувствую, что должен уточнить, с тех пор я продолжил просмотр учебников и т. Д. c. и изменил службу следующим образом:

[Unit]
Description=Temp Check Script
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/python /home/pi/TempCheck/TempCheck.py
User=pi
WorkingDirectory=/home/pi/TempCheck
StartLimitIntervalSec=10
Restart=on-failure

[Install]
WantedBy=multi-user.target

И недавно предоставленные расширенные сообщения об ошибках от этой службы, я полагаю

Edit 2:

Я понял один из учебных пособий, которые я читал, попросили включить:

#!usr/bin/python3

в начало моего сценария. С тех пор я удалил это. Теперь я вижу, что скрипт предположительно работает, но я не получаю никаких уведомлений, которые бы указывали на то, что он делает то, что должен (опять же, странный, потому что он полностью работает при запуске в IDE, а также непосредственно из командной строки) , Однако проверьте еще раз, и мы вернулись в состояние сбоя, на этот раз с первоначальной ошибкой:

(code=exited, status=1/FAILURE)
Start request repeated too quickly.
Failed with result "exit-code"
Failed to start Temp Check Script

Редактировать 3: При попытке с помощью crontab у меня тоже не получилось. Не уверен, почему это так, так как он в основном делает то же самое, что и при непосредственном вызове из командной строки, и при использовании CLI работает нормально. Это говорит мне о том, что в скрипте нет ничего плохого, и есть хороший шанс, что с systemd или crontab действительно нет ничего плохого, но между systemd / crontab и скриптом происходит что-то странное. Я дважды и трижды проверил каталоги, которые я его кормил, и они правильные. У меня совершенно нет идей.

Решение: не пытайтесь использовать переменные окружения в скрипте, просто объявите их прямо. Это лучшее, что у меня есть, хотя я буду продолжать искать способы ссылаться на переменные среды. Совет очень признателен.

1 Ответ

0 голосов
/ 24 января 2020

Вы должны указать интервал между перезапусками сервиса. Вы можете сделать это, установив директиву StartLimitIntervalSec=. После установки этого значения не забудьте перезагрузить демон службы с помощью:

systemctl daemon-reload
...