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

  • 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!

  • 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.

  • 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

  • Hallo noisefloor,

    ja, steht auch in meinem Raspi-Buch das rc.local ein altes Relikt ist - wollte mir es halt schnell und einfach machen. Aber du hast Recht, ich mach was "gescheites" und schau mir systemd an.


    Die prints sind drin weil ich das Script auch manchmal in der Konsole laufen lasse.


    Danke und Gruß

  • 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.

  • 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:

    External Content gist.github.com
    Content embedded from external sources will not be displayed without your consent.
    Through the activation of external content, you agree that personal data may be transferred to third party platforms. We have provided more information on this in our privacy policy.

    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/so…/man/systemd.service.html

  • Euch allen vielen Dank.

    Ohne mich schon eingelesen zu haben (danke für die Links), denke ich, dass ich mit systemd auch bestimmen kann, welcher Prozess unbedingt vorher gelaufen sein muss (After) - das kommt mir sehr entgegen. Danke aber auch die Korrekturinfo zu rc.lokal.