【发布时间】:2017-01-05 01:18:29
【问题描述】:
我正在尝试使用 systemd 运行 python pygame 脚本,由于某种原因,该脚本只是退出而没有错误。 这是在带有 Raspian “Jessie lite” 的 Raspberry Pi 上。
如果我使用“sudo python myscript.py”手动运行脚本,它可以正常工作。
sudo systemctl status myscript.service 报告:
* 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 start 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 而有些却没有?
【问题讨论】:
-
听起来像是错误或配置问题。除非通过
SendSIGHUP=或KillSignal=指定,否则 Systemd 不应发送SIGHUP... -
一个可能的解决方案是在 systemd 中禁用 SIGHUP,但我不确定这会产生什么其他影响:stackoverflow.com/questions/55392107/…
标签: python-2.7 raspberry-pi pygame systemd