mirror of
https://github.com/naruxde/revpipyload.git
synced 2025-11-08 15:13:52 +01:00
Improve log information about plc program exit like termed/killed/exit code
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user