我正在尝试使用systemd运行
python pygame脚本,由于某种原因,脚本只是退出而没有错误.
这是Raspberry Pi与Raspian“Jessie lite”.
如果我使用“sudo python myscript.py”手动运行脚本,它可以正常工作.
sudo systemctl status myscript.service reports:
* myscript.service - Python Script
Loaded: loaded /etc/systemd/system/myscript.service; enabled) Active: inactive (dead) since Mon 2016-08-29 04:33:19 UTC; 1s ago
Process: 3275> ExecStart=/usr/bin/python /home/pi/myscript.py (code=killed, signal=HUP)
Main PID: 3275 (code=killed, signal=HUP)
如果我使用sudo systemctl启动myscript.service手动启动服务,则会发生同样的事情.
我已经将我的脚本删除到pygame.init()调用.这是它退出的地方.
如果我尝试手动初始化模块,那么“cdrom”,“joystick”,“threads”和“font”会正常初始化,但是调用display.init()会导致程序退出.没有例外.
我在网上找到的唯一资源是this guy.看起来他遇到了我所看到的完全相同的事情.
我试过strace,如果我等了足够长的时间(2分钟),它会起作用!
显然我不能一直用strace跑.我认为它减慢了初始化的执行速度,以某种方式允许它工作.
编辑:
所以这个问题似乎是systemd发送一个SIGHUP.如果在Python中未处理此操作,则默认操作是退出.快速解决方法是抓住SIGHUP:
import signal
def handler(signum, frame):
pass
try:
signal.signal(signal.SIGHUP, handler)
except AttributeError:
# Windows compatibility
pass
这么多燃烧的问题.为什么systemd会这样做?为什么strace解决这个问题?为什么有些Python脚本会获得SIGHUP而其他Python脚本却没有?
最佳答案 对我来说,解决方案只是初始化我需要的特定模块.
在我的情况下,而不是pygame.init()我初始化了pygame.mixer.init(),现在systemd可以启动服务.