부팅 시 사용자 Python 애플리케이션 서비스가 시작되지 않습니다.

부팅 시 사용자 Python 애플리케이션 서비스가 시작되지 않습니다.

내 사용자 서비스는 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 $USERpi 사용자가 로그인하지 않은 경우에도 서비스가 실행되도록 실행 중입니다 .

스크립트는 실행 중에 센서에서 데이터를 수집하고 데이터 수집이 완료되면 장치를 종료합니다(즉시 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.targetnot 을 사용해야 합니다 multi-user.target. multi-user.targetsystemd의 사용자 인스턴스에서는 사용되지 않습니다.

바라보다https://www.freedesktop.org/software/systemd/man/systemd.special.html#default.target1

답변2

로그인할 때까지 pi버스가 시작되지 않으므로 서비스가 시작되지 않습니다 . --userMichal의 대답은 부분적으로 정확하지만(모드 대신 사용해야 함) 가장 좋은 대답은 서비스를 시스템 버스에 두는 것입니다.pidefault.targetmulti-user.target--user

pi로그인하지 않고 이 서비스를 실행 하려면 시스템 버스에 넣으세요. 여기에는 다음이 포함됩니다.

  • mv ~/.config/systemd/user/argus.service /etc/systemd/system/
  • 섹션 User=pi이 에 추가되었습니다 .[Service]argus.service

이제 스크립트는 사용자 버스에서 실행될 때와 동일한 권한을 가지지 pi만 사용자의 로그인 상태와는 독립적으로 실행됩니다. 유일한 단점은 장치를 sudo사용 하거나 취급하는 동안 작동해야 한다는 것입니다 .systemctljournalctl

버스의 가장 큰 장점 은 사용자가 특정 서비스 유무에 관계없이 버스 --user를 관리할 수 있다는 것입니다 . 또한 사용자 로그인 또는 로그아웃을 기반으로 서비스를 시작하고 중지할 수 있습니다. 사용자 입력이나 사용자 로그인 트리거 없이 서비스를 시작해야 하므로 시스템 버스가 가장 좋습니다.systemctljournalctlsudo

관련 정보