Скрипт Python не запускается должным образом при перезагрузке/запуске Raspberry Pi

Скрипт Python не запускается должным образом при перезагрузке/запуске Raspberry Pi

Для контекста, я использую Raspberry Pi модели 3B+. В настоящее время я пытаюсь запустить скрипт Python при загрузке Pi. Но я борюсь с тем, чтобы программа запускалась должным образом. Когда я использую следующий служебный файл, он запускается, но перезапускается каждые 10 секунд, из-за чего программа запускается бесконечное количество раз. Я просто хочу, чтобы программа запускалась один раз.

[Unit]
Description=Start Bling

[Service]
User=pi
Environment=DISPLAY=:0
WorkingDirectory=/home/pi/facial_recognition
Environment=XAUTHORITY=/home/pi/.Xauthority
Environment="prog_path"=/home/pi/facial_recognition
ExecStart=/usr/bin/python /home/pi/facial_recognition/run_on_start.py

Restart=always
RestartSec=10s
KillMode=process
TimeoutSec=infinity

[Install]
WantedBy=graphical.target

Но если я удалю эту часть:

Restart=always
RestartSec=10s
KillMode=process
TimeoutSec=infinity

или измените его на Restart=on-failure, то при загрузке Raspberry Pi ничего не произойдет.

Программа не обязательно должна запускаться в режиме автоматического входа в систему на рабочем столе, поэтому если есть возможность исправить это в консольной версии, то это тоже нормально. У меня сейчас так, поэтому проще проверить, работает ли программа так, как задумано.

Я также пробовал использовать crontab, но тогда ничего не произошло при перезагрузке. Ни с '&' в конце, ни без него.

решение1

Вот что, по моему мнению, происходит:

Ваша машина загружается, запускается сервер отображения, и ваша служба активируется. Однако piеще не вошел в систему, поэтому не запускается с первого раза. Вы Restart=alwaysи Restart=10sубедитесь, что он пытается запуститься каждые 10 секунд, и он это делает! Но каким-то образом ваш основной процесс завершается, а Restart=запускается постоянно.

Вот идея решения этой проблемы:

Переместите службу в пользовательскую шину. Это также означает, что вам не нужно определять DISPLAY, XAUTHORITYили , User=так как они неявны. Затем измените [Install]раздел на WantedBy=graphical-session.target. Добавьте PartOf=graphical-session.targetдля остановки службы при выходе пользователя из сеанса. graphical-session.target— это цель, которая доступна только на пользовательской шине и возникает только тогда, когда пользователь входит в графический сеанс. / Restart/ RestartSec/ KillModeнужно TimeoutSecопределять только в том случае, если она вам действительно нужна для чего-то (а не просто для запуска программы).

Это гарантирует, что ваша служба не запустится до тех пор, пока пользователь не войдет в графический сеанс (что, как мне кажется, и мешало ей работать раньше).

Для этого переместите файл службы из /etc/systemd/system/в /home/pi/.config/systemd/user/bling.serviceи придайте ему следующий вид:

[Unit]
Description=Bling
PartOf=graphical-session.target

[Service]
WorkingDirectory=/home/pi/facial_recognition
Environment="prog_path"=/home/pi/facial_recognition
ExecStart=/usr/bin/python /home/pi/facial_recognition/run_on_start.py

[Install]
WantedBy=graphical-session.target

Затем включите его с помощьюsystemctl --user enable bling.service

Связанный контент