我想在启动时尽早在 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