gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 21:08:55 25 4
gpt4 key购买 nike

我正在尝试使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com