내 사용자 서비스는 Python 스크립트이며 시작 시 실행되지 않습니다. Raspbian 운영 체제에서 사용자 pi로 실행됩니다. 대부분의 문제와 마찬가지로 서비스를 시작할 수 있고 제대로 실행되지만 systemctl --user start argus
재부팅 시에는 시작되지 않습니다.
[Unit]
Description=RAL Argus Service
[Service]
Environment=PYTHONUNBUFFERED=1
ExecStart=/usr/bin/python3 /home/pi/RAL/Argus/Hextapus_Base.py -bsi=5 -pupd=59 -bm=1
RemainAfterExit=yes
Restart=no
[Install]
WantedBy=multi-user.target
sudo loginctl --linger $USER
pi 사용자가 로그인하지 않은 경우에도 서비스가 실행되도록 실행 중입니다 .
스크립트는 실행 중에 센서에서 데이터를 수집하고 데이터 수집이 완료되면 장치를 종료합니다(즉시 sudo shutdown 실행). RTC는 시스템을 다시 깨우고 스크립트가 실행되며 프로세스가 다시 반복됩니다.
시작 시 출력은 다음과 같습니다.systemctl --user status argus
pi@raspberrypi:~ $ systemctl --user status argus
â—� argus.service - RAL Argus Service
Loaded: loaded (/home/pi/.config/systemd/user/argus.service; enabled; vendor preset: enabled)
Active: inactive (dead)
이게 대본의 핵심이야
def main():
args=cli(argv) #parse args
try:
normal_operation(args)
rtc_time = Hextapus.Get_string_utc_time_pcf(0)
logger.warning("Issuing Shutdown command at RTC Time: {}".format(rtc_time)) #Indicate os shutdown during hard shutdown and RTC time stamp
os.system('sudo shutdown now')
return 0
except KeyboardInterrupt:
#This is so when debugging the loops are killed quickly
logger.warning("Keyboard ESCAPE detected. Shutting Down")
if __name__ == '__main__':
sys.exit(main(sys.argv))
systemctl --user start argus를 실행하면 서비스 문제가 pi에서 종료되기 때문에 Journalctl에 다음이 표시됩니다.
Dec 03 20:35:39 raspberrypi python3[27653]: 2020-12-03 20:35:39,502 - WARNING - Issuing Shutdown command at RTC Time: 20201203203543
Dec 03 20:35:43 raspberrypi systemd[385]: Stopping RAL Argus Service...
Dec 03 20:35:43 raspberrypi systemd[385]: argus.service: Main process exited, code=killed, status=15/TERM
Dec 03 20:35:43 raspberrypi systemd[385]: argus.service: Succeeded.
Dec 03 20:35:43 raspberrypi systemd[385]: Stopped RAL Argus Service.
이후에 시작하면 서비스가 실행 중이거나 시작할 수 없음을 나타내는 추가 정보가 저널ctl에 없습니다. 스크립트가 닫혀 있다는 사실이 내 문제의 원인인지 잘 모르겠습니다.
감사해요!
답변1
systemd의 사용자 인스턴스에서 서비스를 실행하려는 경우 default.target
not 을 사용해야 합니다 multi-user.target
. multi-user.target
systemd의 사용자 인스턴스에서는 사용되지 않습니다.
바라보다https://www.freedesktop.org/software/systemd/man/systemd.special.html#default.target1
답변2
로그인할 때까지 pi
버스가 시작되지 않으므로 서비스가 시작되지 않습니다 . --user
Michal의 대답은 부분적으로 정확하지만(모드 대신 사용해야 함) 가장 좋은 대답은 서비스를 시스템 버스에 두는 것입니다.pi
default.target
multi-user.target
--user
pi
로그인하지 않고 이 서비스를 실행 하려면 시스템 버스에 넣으세요. 여기에는 다음이 포함됩니다.
mv ~/.config/systemd/user/argus.service /etc/systemd/system/
- 섹션
User=pi
이 에 추가되었습니다 .[Service]
argus.service
이제 스크립트는 사용자 버스에서 실행될 때와 동일한 권한을 가지지 pi
만 사용자의 로그인 상태와는 독립적으로 실행됩니다. 유일한 단점은 장치를 sudo
사용 하거나 취급하는 동안 작동해야 한다는 것입니다 .systemctl
journalctl
버스의 가장 큰 장점 은 사용자가 특정 서비스 유무에 관계없이 버스 --user
를 관리할 수 있다는 것입니다 . 또한 사용자 로그인 또는 로그아웃을 기반으로 서비스를 시작하고 중지할 수 있습니다. 사용자 입력이나 사용자 로그인 트리거 없이 서비스를 시작해야 하므로 시스템 버스가 가장 좋습니다.systemctl
journalctl
sudo