使用者 python 應用程序服務未在啟動時啟動
我的使用者服務是一個 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
是允許使用者使用systemctl
或journalctl
不使用sudo
來管理特定的服務。它還允許根據使用者的登錄或註銷來啟動和停止服務。由於您的服務需要在沒有使用者輸入且沒有使用者登錄觸發器的情況下啟動,因此系統匯流排是最佳位置。
如果您嘗試在 systemd 的使用者實例下執行該服務,您應該使用
default.target
notmulti-user.target
。multi-user.target
不被 systemd 的使用者實例使用。請參閱https://www.freedesktop.org/software/systemd/man/systemd.special.html#default.target1