Einen Überwachungsdämon für Linux

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
2bock
User
Beiträge: 94
Registriert: Freitag 12. September 2003, 07:58
Wohnort: 50.9333300 / 6.3666700

Freitag 20. Mai 2005, 11:10

Hi zusammen.

Ich möchte einen "Überwachungsdämon" schreiben, der auf dem Zielsystem (Linux) andere Dämons startet und sobald diese aus irgendeinem Grund beendet werden, diese neu startet.

Bevor ich jetzt mein Daemon Grundgerüst groß umstricken, wollte ich fragen, ob jemand ein gutes Beispiel kennt, an dem ich mich für soetwas orientieren kann.

Es würde mir auch schon weiterhelfen, wenn mir jemand sagen kann, wie ich auf dem Zielsystem abfragen kann, ob ein Dienst noch aktiv ist und läuft. Sprich ich möchte feststellen, ob die Dienst abgeschmiert ist.

Danke schon mal für eure Kommentare und Hinweise im Voraus.

Greetz from 2bock :wink:
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Freitag 20. Mai 2005, 15:06

Hoi,

tut mir leid, ich have von solchen Dingen keine rechte Ahnung. Im Moment habe ich auch andere Sachen zu tun. Aber ich finde Deine Idee sehr interessant und möchte Dich auch fragen, ob Du Dein Produkt teilen würdest? Ich könnte dann den beta-Tester machen :D .

Gruß,
Christian
2bock_not_logged

Freitag 20. Mai 2005, 15:15

Also wenn ich die Sorcen für diesen Daemon fertig habe, dann kann ich diese hier auch veröffentlichen.

Trozdem besteht zur Zeit die Problematik immer noch.

Greetz from 2bock :wink:
rogen
User
Beiträge: 85
Registriert: Dienstag 29. März 2005, 17:45
Wohnort: neustift
Kontaktdaten:

Freitag 20. Mai 2005, 18:26

hiermit kannst du schauen ob das programm läuft

http://www.python-forum.de/viewtopic.ph ... ght=server


und wenn du eine script hast mit dem du ein script

den befehl damit man python als daemon starten kann habe ich vergessen
wenn ich ihn finde melde ich mich.

mfg
rogen
User
Beiträge: 85
Registriert: Dienstag 29. März 2005, 17:45
Wohnort: neustift
Kontaktdaten:

Samstag 21. Mai 2005, 12:16

python script.py 1&2>/dev/null &
disown python


http://www.python-forum.de/viewtopic.ph ... light=boot


mfg
2bock
User
Beiträge: 94
Registriert: Freitag 12. September 2003, 07:58
Wohnort: 50.9333300 / 6.3666700

Dienstag 24. Mai 2005, 09:29

Hallo alle zusammen. Also ich habe alles ausprobiert und es gibt scheinbar wirklich ur diese eine Lösung. Ich habe es nicht geschafft ohne dieses Dateihandlich auszukommen.
So aber ersteinaml der Reihe nach. Die Lösung besteht darin, das immer wenn auf einem Unix System ein Prozeß gestartet wird, das eine Pid Datei angelegt wird. In dieser steht nur die Nummer des Prozesses. Diese Dateien liegen im Normalfall im /var/run oder im /tmp/ Verzeichnis. Ich habe aber noch ein weiteres Verzeichnis gefunden, in dem zusätzliche Prozeßinformationen liegen. Ich meine das Verzeichnis proc im root verzeichnis. Dort befinden sich Ordner mit den Prozeßnummern als Ordnernamen.

Also hier zuersteinmal der Code um die Pid's zu bekommen. Übergeben werden muß der Name des Prozesses.

Z.B. Mein Skript heist TestDaemon.py
ich übergebe hier nur den Namen TestDaemon.
Wichtig. Wenn der Daemon erstellt wird, dann kann man vorgeben, wie die pid Datei heißt. Ich würde Vorschlagen sie TestDaemon.pid zu nennen. Dann funktioniert es auch mit dieser Funktion.

Code: Alles auswählen

def getpid(name):
    """
    get pid of running 'name'
    """
    for fname in ('/var/run/' + name  + '.pid', '/tmp/' + name + '.pid'):
        #~ print fname
        if os.path.isfile(fname):
            f = open(fname)
            uid = int(f.readline()[:-1])
            f.close()

            proc = '/proc/' + str(uid) + '/cmdline'
            try:
                if os.path.isfile(proc):
                    f = open(proc)
                    proc_arg = f.readline().split('\0')[:-1]
                    f.close()
                else:
                    return fname, CONST_Error

            except (OSError, IOError):
                return fname, CONST_Error
                try:
                    os.unlink(fname)
                except OSError:
                    pass
                return fname, CONST_Error
            return fname, uid,proc_arg
    return fname , CONST_Error
    
    
    
def start_stop_Daemon(action):
    if action == 'stop':
        for daemonName in daemonList:
                if getpid(daemonName)[1] is 0:
                    if daemonName == 'daemon':
                        print 'python '+ daemonName + '.py' + ' stop'
                        os.popen3('python '+ daemonName + '.py' + ' stop')
                    print 'Process with pid ' + str(getpid(daemonName)[1]) + ' is stopped'
    else:
        for daemonName in daemonList:
                if getpid(daemonName)[1] is 0:
                    if daemonName == 'daemon':
                        print 'python '+ daemonName + '.py' + ' start'
                        result = os.popen3('python '+ daemonName + '.py' + ' start')
                        print result
                        
                else:
                    print 'Process is running with pid ' + str(getpid(daemonName)[1]) + ' ' + str(getpid(daemonName)[2])
Im Code gibt es die Zeile

Code: Alles auswählen

os.popen3('python '+ daemonName + '.py' + ' start')
Sie bewirkt, dass das mein Skript ausgeführt wird.
Den Daemon, den ich mit dieser Zeile starte steht auf dieser Seite.

http://aspn.activestate.com/ASPN/Cookbo ... cipe/66012

Also viel Spaß bis dann

Greetz from 2bock :wink:
Antworten