• Członkowie 1 post
    15 marca 2026 00:12

    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?