Modbus-Proxy als Service unter Debian12 mit Python3.11

Von | Januar 28, 2024

Im letzten Beitrag habe ich geschildert, wie man eine bereits laufende Installation des Modbus-Proxies von Debian11 und Python3.9 auf Debian12 mit Python3.9 aktualisieren kann.

Da ich aber bislang noch keinen Beitrag darüber geschrieben hatte, wie ich den Modbus-Proxy überhaupt als Dienst eingerichtet hatte, möchte ich dies nun auf einem aktuellen System nachholen.

Hierzu installieren wir unter Proxmox zu aller erst einen neuen Container mit Debian12.

Die Anleitung im Git-Repository des Modbus-Proxy bereitet hier nun die ersten, kleineren Schwierigkeiten… Das Problem, unter python3.9 konnte der Proxy ohne Virtuelle Umgebung ausgeführt werden und mit pip install modbus-proxy installiert werden.

Dies scheint nun nicht mehr zu funktionieren, denn es erscheint folgende Fehlermeldung:

root@modbus-proxy2:~# pip install modbus-proxy[yaml]
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.
    
    If you wish to install a non-Debian-packaged Python package,
    create a virtual environment using python3 -m venv path/to/venv.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
    sure you have python3-full installed.
    
    If you wish to install a non-Debian packaged Python application,
    it may be easiest to use pipx install xyz, which will manage a
    virtual environment for you. Make sure you have pipx installed.
    
    See /usr/share/doc/python3.11/README.venv for more information.

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.Code-Sprache: PHP (php)

Wir nutzen, wie in der Meldung empfohlen den Befehl pipx, müssen dieses aber erst einmal mit apt installieren:

root@modbus-proxy2:~# apt install pipxCode-Sprache: PHP (php)

Nach erfolgter Installation von pipx, installieren wir den Modbus-Proxy über den Befehl pipx install modbus-proxy[yaml]

root@modbus-proxy2:~# pipx install modbus-proxy[yaml]
  installed package modbus-proxy 0.6.8, installed using Python 3.11.2
  These apps are now globally available
    - modbus-proxy
⚠️  Note: '/root/.local/bin' is not on your PATH environment variable. These apps will not be globally accessible until your PATH is updated.
    Run `pipx ensurepath` to automatically add it, or manually modify your PATH in your shell's config file (i.e. ~/.bashrc).
done! ✨ 🌟 ✨Code-Sprache: PHP (php)

durch die Angabe von [yaml] hinter dem Paket geben wir gleich an, dass wir als Konfigurationsfile ein yaml file nutzen möchten.
Eine Alternative hierzu wäre ansonsten toml – dann über den Befehl pipx install modbus-proxy[toml]

Wie wir anhand der Meldung sehen können, wurde der Modbus-Proxy erfolgreich unter dem Pfad /root/.local/bin installiert. Allerdings muss dieser noch zur PATH-Variablen hinzugefügt werden.
Dies machen wir mit pipx ensurepath

Anschließend kümmern wir uns um das Config-File – dazu wechseln wir in folgendes Verzeichnis:
/root/.local/pipx/venvs/modbus-proxy/lib/python3.11/site-packages und erstellen mit nano ein file wie z.B. mproxy-config.yaml

root@modbus-proxy2:~/.local/pipx/venvs/modbus-proxy/lib/python3.11/site-packages# nano mproxy-conf.yaml

devices:
- modbus:
    url: 192.168.52.120:503
  listen:
    bind: 0:5030Code-Sprache: PHP (php)

Der Inhalt der Konfiguration ist relativ simpel aufgebaut und zeigt auf das Modbus-Gerät (hier 192.168.52.120:503) und auf welchen Port der Proxy für Verbindungen hören soll (hier: 5030)

Nun müssen wir noch den Dienst konfigurieren – und wechseln dazu in das Verzeichnis /etc/systemd/system

Mit nano (oder einem anderen Editor) erstellen wir dann die Datei mproxy.service mit folgendem Inhalt:

[Unit]
Description=Modbus-Proxy service
After=network.targef

[Service]
Type=simple
Restart=always
ExecStart = /root/.local/bin/modbus-proxy -c root/.local/pipx/venvs/modbus-proxy/lib/python3.11/site-packages/mproxy-con>

[Install]
WantedBy=multi-user.targetCode-Sprache: JavaScript (javascript)

Wichtig hier sind die genauen Pfadangaben unter ExecStart

Dann führen wir noch folgende Befehle aus um den Dienst anzulegen:
systemctl daemon-reload
systemctl enable mproxy.service
systemctl start mproxy.service

Der Aufruf sollte nun ohne Fehler erfolgen & zur Kontrolle, ob das ganze auch korrekt ausgeführt wird, können wir dann systemctl status mproxy.service nutzen:

root@modbus-proxy2:/etc/systemd/system# systemctl status mproxy.service
* mproxy.service - Modbus-Proxy service
     Loaded: loaded (/etc/systemd/system/mproxy.service; enabled; preset: enabled)
     Active: active (running) since Sun 2024-01-28 14:08:22 UTC; 1min 28s ago
   Main PID: 966 (modbus-proxy)
      Tasks: 2 (limit: 18723)
     Memory: 13.1M
        CPU: 73ms
     CGroup: /system.slice/mproxy.service
             `-966 /root/.local/pipx/venvs/modbus-proxy/bin/python /root/.local/bin/modbus-proxy -c root/.local/pipx/ven>

Jan 28 14:08:22 modbus-proxy2 systemd[1]: Started mproxy.service - Modbus-Proxy service.
Jan 28 14:08:22 modbus-proxy2 modbus-proxy[966]: 2024-01-28 14:08:22,989     INFO modbus-proxy: Starting...Code-Sprache: PHP (php)

3 Gedanken zu „Modbus-Proxy als Service unter Debian12 mit Python3.11

  1. winfried.peters@gmail.com

    Leider funktioniert in meiner neuen Bookworm-Installation die Anleitung nicht. Die YAML-Datei wird nicht gefunden:
    —————————- snip ———————————
    root@bbb3:~/.local/pipx/venvs/modbus-proxy/lib/python3.11/site-packages# modbus-proxy -c /root/.local/pipx/venvs/modbus-proxy/lib/python3.11/site-packages/mproxy-conf.yaml
    Traceback (most recent call last):
    File „/root/.local/bin/modbus-proxy“, line 8, in
    sys.exit(main())
    ^^^^^^
    File „/root/.local/pipx/venvs/modbus-proxy/lib/python3.11/site-packages/modbus_proxy.py“, line 343, in main
    asyncio.run(run())
    File „/usr/lib/python3.11/asyncio/runners.py“, line 190, in run
    return runner.run(main)
    ^^^^^^^^^^^^^^^^
    File „/usr/lib/python3.11/asyncio/runners.py“, line 118, in run
    return self._loop.run_until_complete(task)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File „/usr/lib/python3.11/asyncio/base_events.py“, line 653, in run_until_complete
    return future.result()
    ^^^^^^^^^^^^^^^
    File „/root/.local/pipx/venvs/modbus-proxy/lib/python3.11/site-packages/modbus_proxy.py“, line 336, in run
    config = create_config(args)
    ^^^^^^^^^^^^^^^^^^^
    File „/root/.local/pipx/venvs/modbus-proxy/lib/python3.11/site-packages/modbus_proxy.py“, line 295, in create_config
    config = load_config(args.config_file) if args.config_file else {}
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File „/root/.local/pipx/venvs/modbus-proxy/lib/python3.11/site-packages/modbus_proxy.py“, line 212, in load_config
    import yaml
    ModuleNotFoundError: No module named ‚yaml‘
    —————————- snip ———————————
    Auch die Varianten
    – Aufruf mit „modbus-proxy -c root/.local/pipx/venvs/modbus-proxy/lib/python3.11/site-packages/mproxy-conf.yaml“ (ohne Backslash vor root)
    – Symbolischer Link auf die YAML-Datei
    führen auf denselben Fehler. Im Netz gibt es einige Hinweise auf den Fehler „ModuleNotFoundError: No module named ‚yaml'“, die sich aber nicht auf Bookworm bzw. pipx beziehen.
    Ich bin ratlos. Hast du einen Tipp?
    Viele Grüße

    Antworten
    1. Christoph Beitragsautor

      einen tipp direkt nicht.
      Ich würde dennoch den Hinweisen im Netz dazu folgen, auch, wenn diese sich nicht explizit auf Bookworm beziehen.

      Vermutlich fehlen dir die Pakete pyyaml oder ähnliches… das sollte dann m.E. unabhängig der OS Version sein.

      Antworten
  2. Hauke

    Den Fehler hatte ich auch. Ich hatte vergessen

    pip install modbus-proxy[yaml]

    zu installieren. „pip install modbus-proxy“ hatte ich schon. Aber dann fehlt die YAML Unterstützung.

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert