用户 python 应用程序服务不会在启动时启动

用户 python 应用程序服务不会在启动时启动

我的用户服务是一个 python 脚本,它不会在启动时运行。它以用户 pi 的身份在 raspbian 操作系统上运行。由于大多数这些问题,我可以启动该服务并且它运行良好,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 中没有进一步的信息表明服务正在运行或无法启动。我不确定脚本关闭的事实是否是我的问题的原因。

谢谢!

答案1

如果您尝试在 systemd 的用户实例下运行该服务,您应该使用default.targetnot multi-user.targetmulti-user.target不被 systemd 的用户实例使用。

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

答案2

您的服务未启动,因为pi的总线在登录--user之前不会启动。虽然 Michal 的答案部分正确(您应该使用而不是in模式),但最好的答案是将您的服务放在系统总线上。pidefault.targetmulti-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特定的服务来管理。它还允许根据用户的登录或注销来启动和停止服务。由于您的服务需要在没有用户输入且没有用户登录触发器的情况下启动,因此系统总线是最好的地方。

相关内容