Systemd

使用者 python 應用程序服務未在啟動時啟動

  • December 4, 2020

我的使用者服務是一個 python 腳本,它不會在啟動時執行。它以使用者 pi 的身份在 raspbian OS 上執行。隨著大多數問題的出現​​,我可以啟動該服務並且它執行良好,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.

在後續啟動時,journalctl 中沒有更多資訊表明該服務正在執行或無法啟動。我不確定腳本發出關閉的事實是否是我的問題的原因。

謝謝!

您的服務未啟動,因為pi’ 的--user匯流排在登錄之前不會啟動pi。雖然 Michal 的回答部分正確(您應該使用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是允許使用者使用systemctljournalctl不使用sudo來管理特定的服務。它還允許根據使用者的登錄或註銷來啟動和停止服務。由於您的服務需要在沒有使用者輸入且沒有使用者登錄觸發器的情況下啟動,因此系統匯流排是最佳位置。

如果您嘗試在 systemd 的使用者實例下執行該服務,您應該使用default.targetnot multi-user.targetmulti-user.target不被 systemd 的使用者實例使用。

請參閱https://www.freedesktop.org/software/systemd/man/systemd.special.html#default.target1

引用自:https://unix.stackexchange.com/questions/622794