So, nach dem ich mich einige Tage nicht gemeldet habe, möchte ich Euch heute, mein Modul zur Programm-Kontrolle vorstellen. Leider konnte ich das mit 'dbus' noch nicht umsetzen.
Folgender Ablauf, wird in dem Modul prog_check.py umgesetzt, das in dem Auftrags-Modul integriert ist:
- Übergabe der aktuellen PID des Auftrags-Modul
- Überprüfung, ob das Auftrags-Modul evtl. schon läuft
- Freigabe des Auftrags-Modul, wenn kein Doppelstart vorliegt
- Auswahldialog bei Doppelstart
-- Auswahlmöglichkeit Abbruch (Nein), schon gestartetes Auftrags-Modul läuft weiter
-- Auswahlmöglichkeit Beenden (Ja), schon gestartetes Auftrags-Modul wird beendet
prog_check.py:
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: utf-8 -*-
### Import Module
import os, re
from gui_dialog import dialog_result, dialog_func, showinfo_func
# Programmaufruf
class prog_control(object):
def description():
'''
Kontrollfunktion für Start von Programmen.
- Übergabe der aktuellen PID des Auftrags-Modul
- Überprüfung, ob das Auftrags-Modul evtl. schon läuft
- Freigabe des Auftrags-Modul, wenn kein Doppelstart vorliegt
- Auswahldialog bei Doppelstart
-- Auswahlmöglichkeit Abbruch (Nein), schon gestartetes Auftrags-Modul läuft weiter
-- Auswahlmöglichkeit Beenden (Ja), schon gestartetes Auftrags-Modul wird beendet
Bei schon gestartetem Programm, wird ein nochmaliges starten
des gleichen Programmes verhindert. Gleichzeitig wird ein
Dialog zum Beenden des aktiven Programmes angeboten.
:param programm: string, Programmnamen
:param titel: string, Programm-Bezeichnung
:param pid_current: int, aktuelle PID des gestarteten Programmes
'''
def __init__(self, programm, titel, pid_current):
self.programm = programm
self.titel = titel
self.pid_current = pid_current
# Die ersten 15 Stellen des Programmnamens
self.prog_short = '{}'.format(self.programm[:15])
self.prog_pid = ''
self.pid_ok = False
self.pid_diff = 0
def prog_list(self):
# Erstelle Datei über aktive IDś
os.system('ps -u $USER > /tmp/id_check 2>/dev/null')
os.system('ps -u > /tmp/id_check2 2>/dev/null')
def prog_check(self):
# Überprüfe ob ID aus pidpath aktuell ist
with open('/tmp/id_check','r') as inf:
for i in inf:
if self.prog_short in i:
line = re.sub('^[ ]+', '', i)
self.prog_pid = line.partition(' ')[0]
self.pid_ok = True
break
if not self.pid_ok:
with open('/tmp/id_check2','r') as inf:
for i in inf:
if self.programm in i:
line = re.sub('[ ]+', '-', i)
self.prog_pid = line.partition('-')[2]
self.prog_pid = self.prog_pid.partition('-')[0]
self.pid_ok = True
break
else:
self.pid_ok = False
if self.prog_pid is not None and self.pid_current is not None:
self.pid_diff = (int(self.prog_pid) - int(self.pid_current))
else:
self.pid_diff = 1
def prog_evaluation(self):
# Programmstart, wenn Programm nicht schon läuft.
# Bei schon laufendem Programm, erfolgt ein
# Dialog über Abbruch oder Programmende des schon laufenden
# Programmes. So besteht die Möglichkeit, bei nochmaligen
# Starten des Programmes, das laufende Programm zu beenden.
if self.pid_ok is True and self.pid_diff is not 0:
info = '''Programm läuft schon mit PID: %s
Möchten Sie dieses Programm beenden?''' % self.prog_pid
dialog_result.clear()
dialog_func(self.titel, info)
if True in dialog_result:
os.kill(int(self.prog_pid), signal.SIGTERM)
os.kill(int(self.pid_current), signal.SIGTERM)
info = 'Programm mit PID: %s wird beendet' % self.prog_pid
showinfo_func(self.titel, info)
sys.exit(1)
else:
os.kill(int(self.pid_current), signal.SIGTERM)
sys.exit(1)
else:
try:
pass
except OSError:
pass
if __name__ == "__main__":
f = prog_control(programm, titel, pid_current)
f.prog_list()
f.prog_check()
f.prog_evaluation()
Auftrag-Modul (Teilausschnitt, wo prog_check.py integriert ist):
Code: Alles auswählen
PROGRAMM = 'bestellorder_lieferant.py'
TITEL = 'Lieferanten-Bestellungen'
AUFTRAGINFO = 'Programm für %s starten?' % TITEL
### Programm ###
def start_bestellorder():
def start_description():
'''
Einstiegs- und Kontrollfunktion der Auftragsabwicklung.
Ziel dieser Funktion, ist das kontrollierte Starten des Moduls
"bestellorder_lieferant.py". Die Kontrollfunktion wird durch das
Modul "prog_check.py" gesteuert.
Folgende Parameter werden dazu benötigt:
:param PROGRAMM: string, Programmnamen
:param TITEL: string, Programm-Bezeichnung
:param pid_current: int, aktuelle PID des gestarteten Programmes
'''
# PID für dieses gestartete Modul
pid_current = os.getpid()
#Kontrollmodul in der startphase
def prog_check(PROGRAMM, TITEL, pid_current):
f = prog_control(PROGRAMM, TITEL, pid_current)
f.prog_list()
f.prog_check()
f.prog_evaluation()
prog_check(PROGRAMM, TITEL, pid_current)
# Dialog-Fenster
# Start oder Abbruch
dialog_func(TITEL, AUFTRAGINFO)
try:
if True in dialog_result:
pass
elif False in dialog_result:
info = 'Der Programmstart für %s wurde abgebrochen!' % TITEL
showinfo_func(TITEL, info)
sys.exit(1)
except (ImportError, OSError):
info = 'Es gab einen Fehler, das Programm für %s konnte nicht gestartet werden!' % TITEL
showinfo_func(TITEL, info)
... hier folgt dann der Haupt-Code für die Auftragsverwaltung.
Ich hoffe, daß ich hier nicht mehr so viele Fehler gemacht habe.
Freue mich über Eure Kritikpunkte und Verbesserungsvorschläge.
Grüße Nobuddy