Programmstart mit rc.local funktioniert nicht richtig

  • Hallo,
    ich würde gerne eine Programm (rtl_433) beim Systemstart automatisch starten lassen und die Ausgabe in eine .txt Datei umleiten.
    Der Aufruf hierzu ist :

    Code
    rtl_433 -R 51 -F csv >/tmp/Sensor_temps.txt


    über ssh funktioniert der Aufruf ohne Probleme (muss mit root sprich sudo gestartet werden), wenn ich diesen jedoch in rc.local eintrage scheint das Programm sich nach kurzer Zeit zu beenden (es gibt keinen Task mit rtl_433, und ich kann rtl_433 noch mauel über ssh starten. Die .txt-Datei für die Ausgabe wird aber erstellt, ist jedoch leer und bekommt auch nach Stunden keinen Eintrag).
    Wenn ich das Programm mit Pfad in rc.local eintrage:

    Code
    /home/xbian/rtl_433/build/src/rtl_433 -R 51 -F csv >/tmp/Sensor_temps.txt


    verhält es sich gleich, außer das es nun eine Task mit rtl_433 gibt (mit gleicher Auslastung wie wenn ich das Programm manuell starte, die erstellte Textdatei bleibt aber ebenfalls leer)

    Hier noch meine rc.local:

    Das andere Programm in rc.lcal startet ohne Probleme.
    Wenn ich rc.local mauel starte über:

    Code
    sudo /etc/rc.local


    funktioniert alles, rtl_433 startet und die Werte werden in die .txt-Datei ausgegeben.

    Ich weiß leider nicht mehr weiter, hat jemand eine Tipp für mich, oder erkennt einen Fehler in meiner rc.local?

    Ach ja, Hardware ist ein RPi2 mit Xbian (vorher verwendete ich OSMC, da hat der Eintrag in der rc.local ohne Probleme funktioniert)

    Gruß,
    H.

    Einmal editiert, zuletzt von Harald654 (29. Oktober 2016 um 19:24)

  • Programmstart mit rc.local funktioniert nicht richtig? Schau mal ob du hier fündig wirst!

  • Hallo Harald,

    Code
    rtl_433 -R 51 -F csv >/tmp/Sensor_temps.txt


    Verwende bitte mal den absoluten Pfad zu rtl_433. Dann sollte es funktionieren.

    Wahrscheinlich musst Du diesen Befehl mit einem [font="Courier New"]Leerzeichen&[/font] beenden, wenn der Boot-Vorgang weiterlaufen soll. Damit startet rtl_433 als Hintergundprozess.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (29. Oktober 2016 um 19:36)

  • Ich würds lieber mit " &> " machen sofern er kein tmpfs für /tmp/ hat denn sonst wird die Datei irgendwann ziemlich groß wenn ständig appended wird.
    Die Datei wird nur dann überschrieben wenn diese Zeile ausgeführt wird, nicht bei jeder Ausgabe.
    Beispiel:

    Code
    (echo 123; sleep 1; echo 567; sleep 1; echo 987) > /tmp/bla

    bewirkt das alle Ausgaben in der Datei landen. ( ) ist eine Gruppierung der Befehle, was ich hier nur verwende um mehrere Ausgaben zu bündeln.

    Code
    /home/xbian/rtl_433/build/src/rtl_433 -R 51 -F csv &>/tmp/Sensor_temps.txt &

    wäre also wie ich finde besser.
    Alternativ:

    Code
    /home/xbian/rtl_433/build/src/rtl_433 -R 51 -F csv >/tmp/Sensor_temps.txt 2>&1 &


    Alternativ:

    Code
    (/home/xbian/rtl_433/build/src/rtl_433 -R 51 -F csv >/tmp/Sensor_temps.txt 2>&1) &


    Ansonsten füge einfach mal ein "echo bla > /tmp/blub" vor das exit in die /etc/rc.local ein um zu prüfen ob das Script überhaupt ausgeführt wird - die Datei muss btw Ausführrechte besitzen.

  • Danke für eure Antworten :)

    mit:

    Code
    /home/xbian/rtl_433/build/src/rtl_433 -R 51 -F csv >/tmp/Sensor_temps.txt 2>&1 &


    wurde eine Fehlermeldung in die txt Datei geschrieben, das der USB Port nicht verfügbar ist.
    Durch das einfügen einer Kurzen Pause in rc.local funktioniert jetzt alles :)

    Code
    sleep 25
    /home/xbian/rtl_433/build/src/rtl_433 -R 51 -F csv >/tmp/Sensor_temps.txt &

    Damit die txt Datei nicht zu groß wird hab ich mich mal an Python versucht und ein kleines Skript geschrieben welches über cron jobs die Datei alle zwei Stunden leert:


    (mir fällt leider keine bessere Möglichkeit ein, da ich immer min. die letzten 6 Werte/Zeilen der Datei benötige)

    Gruß,
    H.

    Einmal editiert, zuletzt von Harald654 (30. Oktober 2016 um 19:33)

  • Code
    sleep 25
    /home/xbian/rtl_433/build/src/rtl_433 -R 51 -F csv >/tmp/Sensor_temps.txt &

    Besser wäre hier eine Befehls-Gruppe zu erstellen damit die weitere Ausführung von /etc/rc.local durch das sleep nicht blockiert wird - so wie du es jetzt hast wird das gesamte Script für 25 Sekunden blockiert erst danach werden die nachfolgenden Zeilen ausführt. Würdest du aber das sleep in die Befehlsgruppe der nachfolgenden Zeile hinzufügen würde der sleep in den Hintergrund geschickt und /etc/rc.local wird nicht blockiert, alle nachfolgenden Zeilen werden also sofort verarbeitet.

    Code
    (sleep 25; /home/xbian/rtl_433/build/src/rtl_433 -R 51 -F csv >/tmp/Sensor_temps.txt) &

    Was aber vielleicht auch Sinn machen könnte wäre eine Schleife die /dev/ttyUSB0 ö.ä. prüft, also solange die Schleife rotieren lassen bis die Datei vorhanden ist, dann die Schleife verlassen und danach dein Befehl ausführen.
    Oder UDEV zu verwenden: FAQ => Nützliche Links / Linksammlung => UDEV


  • cron:

    Code
    tail -n 6 /tmp/Sensor_temps.txt > /tmp/Sensor_temps2.txt && cat /tmp/Sensor_temps2.txt > /tmp/Sensor_temps.txt && rm -f /tmp/Sensor_temps2.txt

    Ah, das kann man also auch ohne zusätzliches Script machen. Dazu ab ich noch zwei Fragen :)
    Liest der Corn die ganze Datei ein, oder nur die benötigten 6 letzten Zeilen? (hab ich eine Geschwindigkeitsvorteil gegenüber meinem Skript?)
    Wenn der Cron die ganze Datei einliest, könnte ich doch eigentlich gleich die Datei überschreiben, ohne Umweg eine zweite Datei zu erstellen, die erste zu löschen und die zweite um zu benennen?

    meigrafd
    das leuchtet ein, vielen Dank für die Verbesserung :)

  • Zitat von Harald654


    Liest der Corn die ganze Datei ein, oder nur die benötigten 6 letzten Zeilen?


    cron nicht corn [emoji12] cron war nur die Andeutung darauf, dass du das in die crontab zur Zeitgesteuerten Ausführung eintragen kannst. Cron selbst liest die Zeilen nicht ein sondern führt nur diesen Befehl zu den eingestellten Zeiten aus. Der Befehl "tail -n 6" macht dies.

    Zitat


    hab ich eine Geschwindigkeitsvorteil gegenüber meinem Skript?


    Theoretisch ja, da du den python interpreter nicht aufrufen musst. Da das aber nur eine Sekunde dauert und das bei einem Intervall von zwei Stunden unbedeutend ist würde ich Nein sagen. Wenn dein Script funktioniert gibts theoretisch auch keinen Grund etwas anderes zu verwenden.

    Zitat


    Wenn der Cron die ganze Datei einliest, könnte ich doch eigentlich gleich die Datei überschreiben, ohne Umweg eine zweite Datei zu erstellen, die erste zu löschen und die zweite um zu benennen?

    Logisch gesehen ja. Praktisch gesehen erhältst du dabei eine leere Datei. Warum das so ist kann ich auch nicht sagen.

    Zu testen wäre nur noch ob dein Programm nach diesem Zugriff dann die Werte weiterhin korrekt am Ende hinzufügt. Oder obs da Probleme mit doppeltem Zugriff gibt. Den Lösungsansatz hab ich nur gepostet, weil du nach ner Alternative gefragt hast. [emoji12] Ich würde nichts ändern, wenn deine Lösung fehlerfrei und wie erwartet funktioniert. Eigenleistung hats immerhin verdient benutzt zu werden [emoji12]

    Nachtrag:
    Ich hätts grad getestet.. es gibt keine Probleme mit dem Zugriff.

    Nachtrag 2:
    Mit Sponge kannst du ohne TMP-File wieder zurück in die Datei schreiben:

    Code
    tail -n 6 datei.txt | sponge datei.txt

    Einmal editiert, zuletzt von florian0285 (31. Oktober 2016 um 22:07)

Jetzt mitmachen!

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