起動時にユーザーの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.targetmulti-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

関連情報