Автоматично изпълнение на Python скрипт на Raspberry Pi
„автоматично изпълнение“:
Това е когато Python скрипт се стартира:
1) при стартиране на системата (boot)
2) периодично (напр. на всеки 5 мин)
3) при заявка (например през Flask API)
4) при събитие (бутон, сензор и т.н.)
1. Стартиране при boot (най-често използвано)
Създаваш service файл:
sudo nano /etc/systemd/system/readtemp.service
Пример:
[Unit]
Description=Read Temperature Script
After=network.target
[Service]
ExecStart=/home/user01/projects/project1/venv/bin/python /home/user01/projects/project1/python/read_temp.py
WorkingDirectory=/home/user01/projects/project1/python
User=user01
Restart=always
[Install]
WantedBy=multi-user.target
После:
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable readtemp.service
sudo systemctl start readtemp.service
sudo systemctl status readtemp.service
Всички услуги, които са enabled, т.е. автоматично стартиращи при boot:
systemctl list-unit-files --type=service | grep enabled
Тази команда показва само текущо активните (running) услуги:
systemctl list-units --type=service --state=running
Само активните услуги, които са и авто-стартиращи:
systemctl list-units --type=service --state=running | awk '{print $1}' | xargs -n1 systemctl is-enabled 2>/dev/null | grep enabledСпиране на активна услуга (текущо стартиране). Това спира услугата веднага, но тя пак може да се стартира при следващ boot, ако е enabled.
sudo systemctl stop <име-на-услугата>.service
Деактивиране на авто-стартиране (премахване от boot). Услугата няма да се стартира автоматично при рестарт.
sudo systemctl disable <име-на-услугата>.service
Има разлика между restart и start, и е важно да се разбере как работят при systemd:
start:
sudo systemctl start <услуга>.service
Стартира услугата незабавно, но не променя дали тя ще се стартира автоматично при следващ boot. Ако услугата е disabled, тя ще се стартира с тази команда, но след рестарт на системата пак няма да се стартира.
restart
sudo systemctl restart <услуга>.service
Първо спира услугата (ако работи), после я стартира отново. Точно като start, не променя auto-start настройката. Т.е. ако услугата е disabled, след рестарт на системата пак няма да се стартира автоматично. Ако е enabled, ще се стартира автоматично и при следващ boot.
--now при disable/enable
Когато комбинираш:
sudo systemctl disable --now <услуга>.service
Услугата спира веднага и деактивира авто-стартиране. Това е най-сигурният начин да „премахнеш“ услугата от активни и авто-стартиращи.
2. Автоматично изпълнение по график (cron)
Отваряш:
crontab -e
Пример:
*/5 * * * * /home/user01/projects/project1/venv/bin/python /home/user01/projects/project1/python/read_temp.py
Това ще го пуска на всеки 5 минути
Важно при cron:
Cron няма:
- същите environment variables
- активиран venv
- същия PATH
Затова винаги използвай пълни пътища.
Leave a comment
No comments