Benutzerabmeldung / Herunterfahren in Python / GTK unter Linux erkennen - SIGTERM / HUP nicht empfangen
OK, das ist vermutlich eine schwierige Frage. Ich habe eine pyGTK-Anwendung, die aufgrund von X Window-Fehlern, die ich nicht fangen / kontrollieren kann, zufällig abstürzt.
Deshalb habe ich einen Wrapper erstellt, der die App neu startet, sobald ein Absturz festgestellt wird. Jetzt tritt das Problem auf, wenn sich der Benutzer abmeldet oder das System herunterfährt. Die App wird mit dem Status 1 beendet. Bei einigen X-Fehlern ist dies jedoch auch der Fall.
Also habe ich buchstäblich alles versucht, um das Herunterfahren / Abmelden zu erwischen, ohne Erfolg. Ich habe Folgendes versucht:
import pygtk
import gtk
import sys
class Test(gtk.Window):
def delete_event(self, widget, event, data=None):
open("delete_event", "wb")
def destroy_event(self, widget, data=None):
open("destroy_event", "wb")
def destroy_event2(self, widget, event, data=None):
open("destroy_event2", "wb")
def __init__(self):
gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
self.show()
self.connect("delete_event", self.delete_event)
self.connect("destroy", self.destroy_event)
self.connect("destroy-event", self.destroy_event2)
def foo():
open("add_event", "wb")
def ex():
open("sys_event", "wb")
from signal import *
def clean(sig):
f = open("sig_event", "wb")
f.write(str(sig))
f.close()
exit(0)
for sig in (SIGABRT, SIGILL, SIGINT, SIGSEGV, SIGTERM):
signal(sig, lambda *args: clean(sig))
def at():
open("at_event", "wb")
import atexit
atexit.register(at)
f = Test()
sys.exitfunc = ex
gtk.quit_add(gtk.main_level(), foo)
gtk.main()
open("exit_event", "wb")
Keines dieser Verfahren ist erfolgreich. Gibt es eine Möglichkeit, das Herunterfahren des Systems auf niedriger Ebene zu erkennen? Google hat nichts dazu gefunden.
Ich denke, es muss einen Weg geben, habe ich recht? : /
BEARBEITEN: OK, mehr Zeug.
Ich habe dieses Shell-Skript erstellt:
#!/bin/bash
trap test_term TERM
trap test_hup HUP
test_term(){
echo "teeeeeeeeeerm" >~/Desktop/term.info
exit 0
}
test_hup(){
echo "huuuuuuuuuuup" >~/Desktop/hup.info
exit 1
}
while [ true ]
do
echo "idle..."
sleep 2
done
Außerdem wurde eine .desktop-Datei erstellt, um sie auszuführen:
[Desktop Entry]
Name=Kittens
GenericName=Kittens
Comment=Kitten Script
Exec=kittens
StartupNotify=true
Terminal=false
Encoding=UTF-8
Type=Application
Categories=Network;GTK;
Name[de_DE]=Kittens
Normalerweise sollte dies die Termdatei beim Abmelden und die HUP-Datei erstellen, wenn sie mit & gestartet wurde. Aber nicht auf meinem System. GDM kümmert sich überhaupt nicht um das Skript, wenn ich mich neu anmelde, läuft es immer noch.
Ich habe auch versucht mitshopt -s huponexit
ohne Erfolg.
EDIT2:
Außerdem gibt es hier noch ein paar Informationen zum eigentlichen Code, das Ganze sieht so aus:
Wrapper Script, that catches errors and restarts the programm
-> Main Programm with GTK Mainloop
-> Background Updater Thread
Der Ablauf ist wie folgt:
Start Wrapper
-> enter restart loop
while restarts < max:
-> start program
-> check return code
-> write error to file or exit the wrapper on 0
Jetzt beim Herunterfahren,start program
return 1. Das bedeutet, dass entweder hanup ausgeführt oder der übergeordnete Prozess beendet wurde. Das Hauptproblem besteht darin, herauszufinden, welcher dieser beiden Vorgänge gerade stattgefunden hat. X Fehler führen ebenfalls zu einer 1. Das Fangen im Shellscript funktioniert nicht.
Wenn Sie sich den aktuellen Code ansehen möchten, schauen Sie ihn sich bei GitHub an:
http://github.com/BonsaiDen/Atarashii