Script läuft nur manuell nicht bei autostart

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Moin, ich habe ein Pythonscript, welches ich über rc.local beim start aufrufe.
    Es startet auch, macht aber nichts, ausser im Hintergrund zu laufen.
    Rufe ich es manuell auf, macht es was es soll, ein shellscript ausführen, wenn ein Schalter betätigt wird.
    Wenn ich es als root oder pi manell starte, klappt alles.
    Berechtigung ist gesetzt, ausführbar ist es auch.
    Besitzer ist pi, aber auch als Besitzer root keine Besserung.
    rc.local

    Code
    /usr/bin/python3 /home/pi/script.py &

    Ich habe es auch schon so im Script probiert, gleiches Problem:
    #!/usr/bin/env python3

    script.py


    Irgendwie stehe ich wieder mal auf dem Schlauch. :cool:
    Wie finde ich jetzt raus, warum es nur manuell läuft ? :helpnew:

    MfG

  • Bash
    #!/bin/sh
    /usr/bin/avconv -loglevel debug -t 10 -f vido4linux2 -r 10 -s 640x480 -i /dev/video0 -vframes 100 -vcodec mpeg4 -y /home/pi/Videos/video.mp4
    /usr/bin/sudo -u pi /usr/bin/mutt -d 5 -s Video email@example.de -a /home/pi/Videos/video.mp4 &
    /usr/bin/ssh -tt user@andererpi /home/user/andere.sh &


    P.S. An der Logdatei .muttdebug sehe ich, dass gar nicht probiert wird mutt aufzurufen, wenns via rc.local läuft.

  • BTW für python3 brauchst du kein "from __future__ import print_function"

    Desweiteren sollte man in der Callback nicht allzuviel machen da sonst Flankenwechsel verpasst werden können. Dein "bouncetime=1" ist auch nahezu unsinnig, 1ms entprellen?

    Schreib das mal auf dieser Basis um: Python Code per Python ausführen (oder so ähnlich)

  • Ok, der Flankenwechsel ist jetzt nicht so sehr das Problem, es schafft wohl kaum einer, die Türe so schnell zu öffnen, dass es nicht erkannt wird.
    Der Schalter steht unter "Spannung" und schnappt sehr schnell auf und zu, deshalb reicht eine bouncetime von 1 locker aus.
    Manuell aufgerufen klappt es ja wunderbar.

  • So z.B.

  • Eine bouncetime von 1ms ist Quatsch, dann kannste den Parameter auch weg lassen. Viel wichtiger ist allerdings das Taster und auch Schalter prellen, es sei denn sie wurden Hardwareseitig entprellt, meistens durch einen Kondensator. Wenn der aber nicht verbaut ist prellt's.

    /etc/rc.local

    Bash
    #!/bin/sh
    
    
    (/usr/bin/python3 /home/pi/script.py &>/tmp/script.log) &
    
    
    exit 0

    Erste und letzte Zeile ist wichtig!
    Außerdem muss die Datei ausführbar sein - falls du sie also überschrieben hast musst du das anpassen. Zur Kontrolle manuell ausführen aber nicht dem Interpreter übergeben denn dann wird ein Shebang und Ausführrechte ignoriert!

    /home/pi/script.py
    [code=php]
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    from RPi import GPIO
    from time import strftime
    from subprocess import call
    from queue import Queue
    from functools import partial


    def setup(pin):
    queue=Queue()
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    GPIO.add_event_detect(pin, GPIO.BOTH, callback=partial(interrupt_Event, queue), bouncetime=200)
    return queue


    def interrupt_Event(q, channel):
    q.put( (channel, GPIO.input(channel)) )


    def main(Taster):
    queue = setup(Taster)
    try:
    while True:
    pin, state = queue.get() # blockiert bis Eintrag im queue vorhanden
    print("pin: %s , state: %s" % (pin, state))
    zeit = strftime("%d.%m.%Y %H:%M:%S")

    if pin == Taster:
    if state == GPIO.HIGH:
    print('{} Schalter an Pin {} meldet offene Tuer'.format(zeit, pin))
    call('/home/pi/video0_email.sh')
    else:
    print('{} Schalter an Pin {} meldet geschlossene Tuer'.format(zeit, pin))

    except (KeyboardInterrupt, SystemExit):
    GPIO.cleanup()
    print("\nQuit\n")


    if __name__ == "__main__":
    main(21)


    #EOF
    [/php]

    /home/pi/video0_email.sh
    [code=php]
    #!/bin/sh
    /usr/bin/avconv -loglevel debug -t 10 -f vido4linux2 -r 10 -s 640x480 -i /dev/video0 -vframes 100 -vcodec mpeg4 -y /home/pi/Videos/video.mp4
    /usr/bin/sudo -u pi /usr/bin/mutt -d 5 -s Video email@example.de -a /home/pi/Videos/video.mp4 &
    /usr/bin/ssh -tt user@andererpi /home/user/andere.sh &
    [/php]

    Beachte beim sh Script das die letzte Zeile bzgl. "ssh" als Benutzer root ausgeführt wird, da /etc/rc.local ebenfalls als root ausgeführt wird, und daher die SSH-Keys die du anscheint nutzt auch im HOME Verzeichnis des root Benutzers liegen müssen.
    Führst du das script.py nämlich manuell ohne sudo aus, hat der "pi" Benutzer durch die "gpio" Gruppe zwar Zugriff auf die gpio's aber die SSH-Keys werden dann im HOME des "pi" Benutzers gesucht/genutzt.

    Desweiteren wird eine Logdatei von allen Ausgaben sowie Fehlermeldungen des script.py erzeugt - das solltest du abschalten/ändern sofern es dann funktioniert denn sonst wächst /tmp/script.log ins unermessliche.

    Wenn es dann immer noch nicht funktioniert, dann poste bitte den Inhalt des logs und spezifiziere genauer "was" nicht funktioniert

Jetzt mitmachen!

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