
Для контекста, я использую 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