Python-Programm start aus rc.local wo als Prozess sichtbar?

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo,

    ich starte über rc.local mehrere Python-Programme und würde dann gerne sehen ob diese gestartet sind und laufen.

    Mit welchem Befehl könnte ich mir das anzeigen lassen? Führen diese eine eigene Prozessnummer etc.?

    Wenn diese Python-Programme dann noch print-Kommandos absetzen, wo landen diese dann?

    Im voraus vielen Dank!

  • Python-Programm start aus rc.local wo als Prozess sichtbar?? Schau mal ob du hier fündig wirst!

  • Mit welchem Befehl könnte ich mir das anzeigen lassen?

    Z.B. mit htop oder pgrep -f $(basename Skript.py). Das Ergebnis ist die PID.

    Oder ein kleines Bash-Skript schreiben:

    Bash
    #!/bin/bash
    SCRIPT=/home/pi/test.py
    PID="$(pgrep -f $(basename $SCRIPT))"
    if [[ ! -z "$PID" ]] ; then
       echo "$SCRIPT läuft"
    else
       echo "$SCRIPT läuft nicht"
    fi

    Wenn diese Python-Programme dann noch print-Kommandos absetzen, wo landen diese dann?

    Die landen im Nirvana.

  • Moin bug-reporter,

    du hast recht. Es muss umgekehrt sein.

    Bash
    #!/bin/bash
    SCRIPT=/home/pi/ledtest.sh
    PID="$(pgrep -x $(basename $SCRIPT))"
    if [[ ! -z "$PID" ]] ; then
       echo "$SCRIPT läuft nicht"
    else
       echo "$SCRIPT läuft"
    fi

    Habe nur den zu überprüfende Scriptnamen geändert.

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

  • Hallo,

    bug-reporter : rc.local ist schon länger tot, das willst du nicht mehr benutzen. Das existiert noch noch aus Gründen der Rückwärtskompatibilität und wird von systemd ausgeführt. Stand der Dinge ist schon länger ein Skript per systemd Service Unit auszuführen.

    Ein Skript im Hintergrund ausführen und die Ausgabe der print-Funktion sehen zu wollen ist ein Widerspruch in sich... Wenn du eine Ausgabe brauchst, dann sollte das Skript das in eine Log-Datei schreiben. Python hat dafür das Logging-Modul an Bord, damit ist das einfach umzusetzen.

    Gruß, noisefloor

  • Mit systemd kannst du sehen ob dein Script läuft. Systemd kann das Script auch neu starten wenn es mal abstürtzt. Die PID wird dir angezeigt und print ausgaben landen im journal (man sollte trotzdem auf logging setzen). Du kannst auch die Scripte in abhängigkeit zueinander starten oder Zeit abhängig.

    Hier mal ein Beispiel , ich habe diese Anleitung benutzt:

    Ich habe das Script main.py unter folgendem Pfad erstellt /home/synology/raspberrypi_forum

    Python: main.py
    import time
    
    def main():
        while True:
            print('Hello World')
            time.sleep(10)
    
    
    if __name__ == '__main__':
        main()

    Und noch eine service unit unter /etc/systemd/system erstellt

    Mit systemctl start myscipt.service die Unit zum test gestartet und nach kurzer Zeit mit systemctl status myscript.service mir den Status angesehen.

    Jetzt müsste man nur noch die Unit mit systemctl enable myscript.service aktivieren damit das Script auch nach einen Neustart gestartet wird.

    Einmal editiert, zuletzt von Steinardo (6. August 2021 um 10:00)

  • Das Programm neu starten, falls es abstürzt.

    Man kann noch viel mehr machen. Man kann den Prozess sogar vom Rest des Systems isolieren.

    Der Prozess kann z.B. ein eigenes tmp Verzeichnis haben, dass für andere Prozesse nicht sichtbar ist.

    Man kann sockets durch systemd öffnen lassen und dem Python-Prozess wird der geöffnete Port übergeben.

    Also die Möglichkeiten durch systemd sind sehr vielfältig und leicht zu konfigurieren, sofern man die Dokumentation liest.

    Hier mal ein Beispiel mit sockets:

    Externer Inhalt gist.github.com
    Inhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

    Systemd öffnet den socket und übergibt den bereits geöffneten Socket an das Python-Programm mit FileDescriptorNr. 3

    Mit bash wäre das z. B. ziemlich schwierig umzusetzen.

  • Was macht das Restart=always?


    If set to always, the service will be restarted regardless of whether it exited cleanly or not, got terminated abnormally by a signal, or hit a timeout.

    Wie Dead_Eye schon schrieb die Möglichkeiten sind gross. Auf Ubuntuusers is das Thema systemd ganz gut erklärt https://wiki.ubuntuusers.de/systemd/. Wenn es ausführlicher sein soll ende ich immer hier https://www.freedesktop.org/software/syste…md.service.html

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!