Autostart Python3-Script - Script tut nichts, aber 100%cpu?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
neovanmatix
User
Beiträge: 19
Registriert: Samstag 28. Dezember 2013, 20:52

Hallo,

ich habe - als Entwurf - ein kurzes Python3-Script geschrieben, dass ich auf einem Raspberry Pi mit Raspbian beim Start ausführen möchte.
Bisher habe ich vorige Scripte per "@reboot python3 script.py" in den crontab geschrieben; gerade habe ich auch den Weg über die rc.local versucht.

Beim Autostart wird das Script zwar im Hintergrund gestartet, jedoch verbraucht es 100% CPU und funktioniert nicht (es schaltet einen GPIO wenn der Bildschirmschoner aktiviert/deaktiviert wird, um eine Hintergrundbeleuchtung an- bzw. auszuschalten).

Kille ich den Prozess und führe das Script erneut per "python3 script.py" aus, funktioniert es wie erwartet.

Woran könnte das liegen? Sollte doch eigentlich im gleichen Kontext gestartet werden?

Edit: Ich habe so das Gefühl, dass das Script immer dann zickt, wenn kein Benutzer (z.B. per SSH) eingeloggt ist. Die lokale Sitzung + Display mit X11 ist aber gestartet.
Starte ich das Script per Putty mit & am Ende und schließe daraufhin die letzte Putty-Sitzung, funktioniert's auch nicht mehr? Der GPIO wird also nicht geschaltet, und somit bleibt das Display aus :/

Code: Alles auswählen

import subprocess

subprocess.Popen(['sudo', 'sh', '-c', 'echo 252 > /sys/class/gpio/export'])
subprocess.Popen(['sudo', 'sh', '-c', 'echo "out" > /sys/class/gpio/gpio252/direction'])
subprocess.Popen(['sudo', 'sh', '-c', 'echo "1" > /sys/class/gpio/gpio252/value'])

process = subprocess.Popen(['xscreensaver-command','-watch'], stdout=subprocess.PIPE)
for line in iter(process.stdout.readline, ''):
    read_line = line.decode("utf-8")
    if "BLANK" in read_line and not "UNBLANK" in read_line:
        print("Bildschirmschoner aktiviert")
        subprocess.Popen(['sudo', 'sh', '-c', 'echo "0" > /sys/class/gpio/gpio252/value'])
    if "UNBLANK" in read_line:
        print("Bildschirmschoner deaktiviert")
        subprocess.Popen(['sudo', 'sh', '-c', 'echo "1" > /sys/class/gpio/gpio252/value'])

# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
BlackJack

@neovanmatix: Ist X denn zu dem Zeitpunkt wo das Skript beim neustart des Systems anläuft denn schon gestartet?

Und das ``&`` nicht ausreicht ist klar. Wenn das Terminal, also der Elternprozess wegbricht, dann werden auch asynchron laufende Kindprozesse beendet. Da müsstest Du mit ``nohup``, ``screen``, oder ``tmux`` arbeiten. Eines der letzten beiden verwende ich gerne zusammen mit, beziehungsweise über ``byobu``.
neovanmatix
User
Beiträge: 19
Registriert: Samstag 28. Dezember 2013, 20:52

Hallo,

als ich das Script per rc.local gestartet habe, wurde 1-2 Zeilen vorher der X-Server gestartet.
Es wäre also etwas anderes, wenn ich "screen python3 script.py" ausführen würde? Hm.. heute Abend mal testen. Danke!
Hellstorm
User
Beiträge: 231
Registriert: Samstag 22. Juni 2013, 15:01

Wieso nutzt du eigentlich nicht RPi.GPIO? Dann musst du dich nicht so blöd mit Subprocess herumschlagen.

https://pypi.python.org/pypi/RPi.GPIO
neovanmatix
User
Beiträge: 19
Registriert: Samstag 28. Dezember 2013, 20:52

Hellstorm hat geschrieben:Wieso nutzt du eigentlich nicht RPi.GPIO? Dann musst du dich nicht so blöd mit Subprocess herumschlagen.

https://pypi.python.org/pypi/RPi.GPIO
Hallo,
weil ich nicht wusste, das ich damit auch "nicht-standard-GPIO's" schalten kann?
Wenn ich das richtig verstanden habe, sitzen extra GPIOs auf dem TFT-Controller für die Hintergrundbeleuchtung.
Hellstorm
User
Beiträge: 231
Registriert: Samstag 22. Juni 2013, 15:01

Achso, wusste ich nicht. Vielleicht kann man das im Quellcode des Moduls ja ändern. Ich hab damit nur mal einige LEDs geschaltet :D
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Code: Alles auswählen

    if "BLANK" in read_line and not "UNBLANK" in read_line:
        bla()
    if "UNBLANK" in read_line:
        blubb()
Warum nicht:

Code: Alles auswählen

    if "UNBLANK" in read_line:
        blubb()
    elif "BLANK" in read_line:
        bla()
Ja, es gibt elif.
In specifications, Murphy's Law supersedes Ohm's.
Antworten