Dzień dobry.
Pracuję nad skryptem wykorzystującym bibliotekę "pymodbus" do odczytu danych w trybie synchronicznym protokołem ModBus RTU, uruchamianym jako daemon w systemie RaspianOS opartym na Debianie 11. Program zapisuje odczytane dane do plików. Tryb daemon-a oparty jest na skrypcie HanzDaemon używającym podwójnego odgałęzienia. Daemon korzysta zarówno z zapisu wyjścia do standardowego deskryptora pliku jak i zapisu błędów do standardowego deskryptora pliku.
def _makeDaemon(self):
"""
tworzenie demona - podwójne rozgałęzienie
"""
try:
pid = os.fork()
if pid > 0:
# Exit first parent.
sys.exit(0)
except OSError as err:
print(f'Błąd rozwidlenia #1: {err}')
sys.exit(1)
# odłączenie od środowiska rodzica
os.chdir('/')
os.setsid()
os.umask(0)
# wykonanie drugiego odgałęzienia
try:
pid = os.fork()
if pid > 0:
# Exit from second parent.
sys.exit(0)
except OSError as err:
print(f'Błąd rozwidlenia #2: {err}')
sys.exit(1)
print(f'Proces demona uruchomiono w tle (PID:{os.getpid()}).')
# przekierowanie standardowych deskryptorów plików
sys.stdout.flush()
sys.stderr.flush()
si = open(self.stdin, 'r')
so = open(self.stdout, 'a+')
se = open(self.stderr, 'a+')
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
Wykorzystuję w programie obsługę wyjątków "try - except" do przechwytywania błędów "IO Exception" i "Communication Exception". Zapis do pliku wyjściowego komunikatów o błędach jest opóźniony czasowo. Program przechowuje wystąpienie pierwszego błędu i po zdefiniowanym czasie sprawdza, czy błąd nadal występuje co jest odnotowywane odpowiednim komunikatem w pliku wyjściowym. Skrypt pracuje prawidłowo.
Problemem jest brak jakiejkolwiek kontroli nad ilością komunikatów błędów zapisywanych do pliku błędów, który w wypadku ich wystąpienia rośnie do horrendalnych rozmiarów.
Na przykład: brak portu szeregowego odnotowywany jest w pliku wyjściowym komunikatami co pięć minut. W tym czasie plik błędów zawiera 100 komunikatów "[Errno 2] could not open port /dev/ttyUSB0".
Inny przykład: brak odpowiedzi od urządzenia ModBus slave odnotowywane jest w pliku wyjściowym komunikatami co 15 minut. W tym czasie plik błędów zawiera komunikaty "No response received after 3 retries, continue with next request" w ilości odpowiadającej ilości odpytywanych rejestrów.
Jak zapanować nad ilością komunikatów błędów zapisywanych do pliku błędów?