Improve log information about plc program exit like termed/killed/exit code

This commit is contained in:
2022-04-02 21:47:32 +02:00
parent cbfd69d852
commit 581c0736be

View File

@@ -3,13 +3,14 @@
__author__ = "Sven Sager" __author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2020 Sven Sager" __copyright__ = "Copyright (C) 2020 Sven Sager"
__license__ = "GPLv3" __license__ = "GPLv3"
import os import os
import shlex import shlex
import subprocess import subprocess
from pwd import getpwuid from pwd import getpwuid
from sys import stdout as sysstdout from sys import stdout as sysstdout
from threading import Event, Thread from threading import Event, Thread
from time import sleep, asctime from time import asctime, sleep
import proginit import proginit
from helper import _setuprt, _zeroprocimg from helper import _setuprt, _zeroprocimg
@@ -18,7 +19,6 @@ from watchdogs import SoftwareWatchdog
class RevPiPlc(Thread): class RevPiPlc(Thread):
"""Verwaltet das PLC Python Programm. """Verwaltet das PLC Python Programm.
Dieser Thread startet das PLC Python Programm und ueberwacht es. Sollte es Dieser Thread startet das PLC Python Programm und ueberwacht es. Sollte es
@@ -54,9 +54,7 @@ class RevPiPlc(Thread):
def __exec_rtlevel(self): def __exec_rtlevel(self):
"""RealTime Scheduler nutzen nach 5 Sekunden Programmvorlauf.""" """RealTime Scheduler nutzen nach 5 Sekunden Programmvorlauf."""
if self.rtlevel > 0 \ if self.rtlevel > 0 and not self._evt_exit.wait(5) and self._procplc.poll() is None:
and not self._evt_exit.wait(5) \
and self._procplc.poll() is None:
_setuprt(self._procplc.pid, self._evt_exit) _setuprt(self._procplc.pid, self._evt_exit)
def __get_autoreloaddelay(self): def __get_autoreloaddelay(self):
@@ -93,19 +91,14 @@ class RevPiPlc(Thread):
"""Setzt UID und GID fuer das PLC Programm.""" """Setzt UID und GID fuer das PLC Programm."""
proginit.logger.debug("enter RevPiPlc._setuppopen()") proginit.logger.debug("enter RevPiPlc._setuppopen()")
proginit.logger.info( proginit.logger.info("set uid {0} and gid {1} for plc program".format(self.uid, self.gid))
"set uid {0} and gid {1} for plc program".format(
self.uid, self.gid)
)
# Set user last to hold root right to do the group things # Set user last to hold root right to do the group things
try: try:
name = getpwuid(self.uid).pw_name name = getpwuid(self.uid).pw_name
os.initgroups(name, self.gid) os.initgroups(name, self.gid)
except Exception: except Exception:
proginit.logger.warning( proginit.logger.warning("could not initialize the group access list with all groups")
"could not initialize the group access list with all groups"
)
os.setgid(self.gid) os.setgid(self.gid)
os.setuid(self.uid) os.setuid(self.uid)
@@ -151,9 +144,7 @@ class RevPiPlc(Thread):
# LogWriter starten und Logausgaben schreiben # LogWriter starten und Logausgaben schreiben
if self._plw is not None: if self._plw is not None:
self._plw.logline("-" * 55) self._plw.logline("-" * 55)
self._plw.logline("plc: {0} started: {1}".format( self._plw.logline("plc: {0} started: {1}".format(os.path.basename(self._program), asctime()))
os.path.basename(self._program), asctime()
))
self._plw.start() self._plw.start()
# Befehlstliste aufbauen # Befehlstliste aufbauen
@@ -184,22 +175,13 @@ class RevPiPlc(Thread):
proginit.logger.info("plc program did a clean exit") proginit.logger.info("plc program did a clean exit")
if self.zeroonexit: if self.zeroonexit:
_zeroprocimg() _zeroprocimg()
proginit.logger.info( proginit.logger.info("set piControl0 to ZERO after PLC program returns clean exitcode")
"set piControl0 to ZERO after "
"PLC program returns clean exitcode"
)
else: else:
# PLC Python Programm abgestürzt # PLC Python Programm abgestürzt
proginit.logger.error( proginit.logger.error("plc program crashed - exitcode: {0}".format(self.exitcode))
"plc program crashed - exitcode: {0}"
"".format(self.exitcode)
)
if self.zeroonerror: if self.zeroonerror:
_zeroprocimg() _zeroprocimg()
proginit.logger.warning( proginit.logger.warning("set piControl0 to ZERO after PLC program error")
"set piControl0 to ZERO after "
"PLC program error"
)
if not self._evt_exit.is_set() and self.autoreload: if not self._evt_exit.is_set() and self.autoreload:
self._delaycounter -= 1 self._delaycounter -= 1
@@ -209,13 +191,9 @@ class RevPiPlc(Thread):
# Prozess neu starten # Prozess neu starten
self._procplc = self._spopen(lst_proc) self._procplc = self._spopen(lst_proc)
if self.exitcode == 0: if self.exitcode == 0:
proginit.logger.warning( proginit.logger.warning("restart plc program after clean exit")
"restart plc program after clean exit"
)
else: else:
proginit.logger.warning( proginit.logger.warning("restart plc program after crash")
"restart plc program after crash"
)
self.__exec_rtlevel() self.__exec_rtlevel()
else: else:
break break
@@ -224,9 +202,7 @@ class RevPiPlc(Thread):
if self._plw is not None: if self._plw is not None:
self._plw.logline("-" * 55) self._plw.logline("-" * 55)
self._plw.logline("plc: {0} stopped: {1}".format( self._plw.logline("plc: {0} stopped: {1}".format(os.path.basename(self._program), asctime()))
os.path.basename(self._program), asctime()
))
proginit.logger.debug("leave RevPiPlc.run()") proginit.logger.debug("leave RevPiPlc.run()")
@@ -260,23 +236,25 @@ class RevPiPlc(Thread):
while self._procplc.poll() is None and count < self._stop_timeout_steps: while self._procplc.poll() is None and count < self._stop_timeout_steps:
count += 1 count += 1
proginit.logger.info( proginit.logger.debug("wait term plc program {0} seconds".format(count * 0.5))
"wait term plc program {0} seconds".format(count * 0.5)
)
sleep(0.5) sleep(0.5)
if self._procplc.poll() is None: if self._procplc.poll() is None:
proginit.logger.warning( proginit.logger.warning("can not term plc program {0}".format(self._program))
"can not term plc program {0}".format(self._program)
)
self._procplc.kill() self._procplc.kill()
proginit.logger.warning("killed plc program") proginit.logger.warning("killed plc program")
# Exitcode auswerten # Exitcode auswerten
self.exitcode = self._procplc.poll() self.exitcode = self._procplc.poll()
if self.zeroonexit and self.exitcode == 0 \ if self.zeroonexit and self.exitcode == 0 or self.zeroonerror and self.exitcode != 0:
or self.zeroonerror and self.exitcode != 0:
_zeroprocimg() _zeroprocimg()
if self.exitcode == 0:
proginit.logger.info("stopped plc program")
elif self.exitcode == -15:
proginit.logger.warning("terminated plc program without own exit code")
elif self.exitcode is not None and self.exitcode > 0:
proginit.logger.warning("stopped plc program with exit code {0}".format(self.exitcode))
if self._plw is not None: if self._plw is not None:
self._plw.stop() self._plw.stop()
self._plw.join() self._plw.join()