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 huponexitohne 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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage