맥락상 저는 Raspberry Pi 모델 3B+를 사용하고 있습니다. 현재 Pi가 부팅될 때 Python 스크립트를 실행하려고 합니다. 하지만 프로그램을 올바르게 시작하는 데 어려움을 겪고 있습니다. 다음 서비스 파일을 사용하면 시작되지만 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
아직 로그인을 안해서 처음에는 시작이 안되네요. 매 10초마다 시작을 시도하는지 확인 Restart=always
하세요 . Restart=10s
그러나 어떻게든 주요 프로세스가 종료되고 Restart=
계속 실행됩니다.
이를 해결하기 위한 아이디어는 다음과 같습니다.
서비스를 사용자 버스로 이동합니다. 이는 또한 암시적이므로 DISPLAY
, XAUTHORITY
또는 를 정의할 필요가 없음을 의미합니다 . User=
그런 다음 [Install]
해당 섹션을 WantedBy=graphical-session.target
.Add 로 변경하여 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