python pygameスクリプトをシステムサービスとして実行するには?

python pygameスクリプトをシステムサービスとして実行するには?

起動時にできるだけ早くRaspberry PiでPython PyGameスクリプトを実行したいと思います。スクリプト自体はPyGameとPySerialモジュールに依存します。

目的の結果を得るために、Pythonスクリプトをサービスにラップし、systemdの設定を作成することにしました。

しかし、残念ながら、これらの条件では、スクリプトは正しく機能しません。 pygame.display.init() 行で実行が中断されます。ブートプロセス全体が完了した後もsystemctlを介してサービスを再起動しましたが、動作は何ら変わりませんでした。

サービスを初めて作成するので、非常に明白なミスを犯している可能性があります。しかし、ここで何が間違っていて、なぜsystemdがこのスクリプトを正常に実行できないのかを教えてください。

以下は縮小されたmain.pyです。

import os
import pygame

if __name__ == "__main__":
    print 'Starting IC app ...'
    print 'Environment variables:'
    print os.environ
    print 'Starting pygame initialization'
    pygame.display.init()
    print 'pygame display module initialized'
    pygame.font.init()
    print 'pygame font module initialized'

.service ファイルは次のとおりです。

[Unit]
Description=IC service
StartLimitIntervalSec=0
Before=dhcpcd.service
Wants=dhcpcd.service

[Service]
Type=simple
Restart=on-abort
RestartSec=1
SendSIGHUP=no
User=root
Environment="NO_AT_BRIDGE=1" "PYTHONUNBUFFERED=1" "DISPLAY=:0"
ExecStart=/usr/bin/python /home/pi/ic/src/main.py
StandardOutput=journal+console
StandardError=journal+console

[Install]
WantedBy=multi-user.target

以下は、SSHを介してrootとして実行したときのスクリプト出力です(予想どおりに機能します)。

root@raspberrypi:/home/pi/ic/src# python main.py 
Starting IC app ...
Environment variables:
{'NO_AT_BRIDGE': '1', 'LOGNAME': 'root', 'USER': 'root', 'HOME': '/root', 'PATH': '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin', 'DISPLAY': ':0', 'LANG': 'en_GB.UTF-8', 'TERM': 'xterm', 'SHELL': '/bin/bash', 'SHLVL': '1', 'SUDO_USER': 'pi', 'USERNAME': 'root', 'SUDO_UID': '1000', 'SDL_VIDEO_X11_WMCLASS': 'main.py', '_': '/usr/bin/python', 'SUDO_COMMAND': '/bin/su', 'SUDO_GID': '1000', 'PWD': '/home/pi/ic/src', 'MAIL': '/var/mail/root'}
Starting pygame initialization
pygame display module initialized
pygame font module initialized

以下はJournalctlから取得したスクリプト出力です。

systemd[1]: Started IC service.
python[1217]: Starting IC app ...
python[1217]: Environment variables:
python[1217]: {'LANG': 'en_GB.UTF-8', 'NO_AT_BRIDGE': '1', 'TERM': 'linux', 'SHELL': '/bin/sh', 'JOURNAL_STREAM': '8:17484', 'SDL_VIDEO_X11_WMCLASS': 'main.py', 'LOGNAME': 'root', 'USER': 'root', 'HOME': '/root', 'PATH': '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin', 'PYTHONUNBUFFERED': '1', 'DISPLAY': ':0', 'INVOCATION_ID': '2e02b3153baf4ab9be43b66157980bcb'}
python[1217]: Starting pygame initialization

実行時の環境変数との視覚的な違い(左側はSSH、右側はsystemd) ここに画像の説明を入力してください。

ベストアンサー1

おすすめ記事