Ich versuche, ein Python-Pygame-Skript mit Systemd auszuführen, und aus irgendeinem Grund wird das Skript einfach ohne einen Fehler beendet. Dies ist auf einem Raspberry Pi mit Raspian "Jessie Lite".pygame.init() schlägt fehl, wenn mit systemd ausgeführt
Wenn ich das Skript manuell mit "sudo python myscript.py" ausführen, funktioniert es gut.
sudo systemctl Status myscript.service Berichte:
* 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)
Wenn ich den Dienst manuell mit sudo starten systemctl starten myscript.service das gleiche passiert.
Ich habe mein Skript auf den Aufruf pygame.init() reduziert. Hier endet es.
Wenn ich versuche, die Module manuell zu initialisieren, werden "cdrom", "Joystick", "threads" und "font" normal initialisiert, aber ein Aufruf von display.init() bewirkt, dass das Programm beendet wird. Es gibt keine Ausnahme.
Die einzige Ressource, die ich online finden konnte, ist this guy. Es scheint, als wäre er genau auf dasselbe gestoßen, was ich sehe. Ich habe strace versucht und wenn ich lange genug warte (2 Minuten), wird es funktionieren! Offensichtlich kann ich die ganze Zeit nicht mit strace rennen. Ich denke, es verlangsamt die Ausführung der Initialisierung, damit es irgendwie funktioniert.
EDIT: Das Problem scheint systemd Senden einer SIGHUP. Wenn dies in Python nicht behandelt wird, wird standardmäßig die Aktion beendet. Eine schnelle Lösung ist der Haken SIGHUP:
import signal
def handler(signum, frame):
pass
try:
signal.signal(signal.SIGHUP, handler)
except AttributeError:
# Windows compatibility
pass
So viele brennende Fragen. Warum macht Systemd das? Warum repariert Strace das Problem? Warum erhalten einige Python-Skripte SIGHUP, während andere dies nicht tun?
Klingt wie ein Fehler oder Konfigurationsproblem. Systemd sollte 'SIGHUP' nicht senden, außer über' SendSIGHUP = 'oder' KillSignal = '... – dhke