python-2.7 - 使用 systemd 运行时 pygame.init() 失败

标签 python-2.7 raspberry-pi pygame systemd

我正在尝试使用 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 中未处理,则默认操作是退出。快速修复是 catch SIGHUP:
import signal
def handler(signum, frame):
    pass

try:
    signal.signal(signal.SIGHUP, handler)
except AttributeError:
    # Windows compatibility
    pass

这么多紧迫的问题。为什么 systemd 会这样做?为什么 strace 能解决这个问题?为什么有些 Python 脚本会得到 SIGHUP 而有些却没有?

最佳答案

我没有答案,但我遇到了同样的事情,所以我会添加更多细节。

这是缩减的代码:

#!/usr/bin/python2.7

import logging
from pygame import display
import signal
import time

def handler(signum, frame):
  """Why is systemd sending sighups? I DON'T KNOW."""
  logging.warning("Got a {} signal. Doing nothing".format(signum))

signal.signal(signal.SIGHUP, handler)
signal.signal(signal.SIGTERM, handler)
signal.signal(signal.SIGCONT, handler)

logging.warning("About to start display.")
try:
  display.init()   # hups
except Exception as ex:
  logging.warning("Got any exception: %s " % ex)

logging.warning("Quitting in 60")
time.sleep(60)

这是产生的日志:
Jul  8 22:30:27 beardog systemd[1]: Started PyGame Test.
Jul  8 22:30:27 beardog pygame[17406]: WARNING:root:About to start display.
Jul  8 22:30:27 beardog pygame[17406]: WARNING:root:Got a 1 signal. Doing nothing
Jul  8 22:30:27 beardog pygame[17406]: WARNING:root:Got a 18 signal. Doing nothing
Jul  8 22:30:27 beardog pygame[17406]: WARNING:root:Quitting in 60

它在 SIGHUP 之后立即获得 SIGCONT,但没有 SIGTERM。 Systemd 声称只会在 SIGTERM 之后发送 SIGHUP,所以它可能来自其他地方?不过,我在 pygame 代码中找不到任何相关内容。

我打开了 systemd 调试日志,但它没有打印任何有趣的东西。

这是我的系统配置。
[Unit]
Description=PyGame Test
After=syslog.target network.target network-online.target graphical.target

[Service]
Type=simple
WorkingDirectory=/path/to/code/pygame/
ExecStart=/path/to/code/pygame/why.py
Restart=always
RestartSec=5
LimitNOFILE=10000
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=pygame
SendSIGHUP=no

[Install]
WantedBy=multi-user.target

我已经将它作为 Type=forking、oneshot 和 dbus 进行了尝试(尽管它们都不是)。我也试过 TimeoutStartSec=20,但没有改变。在 Ubuntu Xenial 笔记本电脑和运行 Raspbian 的 Raspberry pi 上进行了测试。 python2.7和python3。代码在手动运行时工作正常,并且在 systemd 中的 strace 下运行时似乎工作。/o\

像 OP 一样,我可以通过捕捉 SIGHUP 来解决它,但是经过这么多调试后,我很想知道发生了什么。

关于python-2.7 - 使用 systemd 运行时 pygame.init() 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39198961/

相关文章:

python - 二进制到 Python 中的字符串/文本

video - 用于全高清 h.264 视频的 gstreamer srtp

ubuntu - QEMU Raspberry Pi 仿真,无视频

python - 在 Pygame 中使用 screen.blit 时可以使用 .format 功能吗?

Python 类/实例/对象组织问题

python - Pygame 幻灯片延迟通常很长

python - 为什么 GAE python SDK 在 vi​​rtualenv 中使用系统的 python?

python-2.7 - 使用 buildozer 将 python 文件转换为 apk 时生成错误

python - python wav处理,nframe不等于实际帧数

audio - 无法让 JACK 音频/网络插孔通过 LAN 工作