Temperaturlogging + webserver Problem cronjob

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Gemeinde,

    ich habe es endlich geschafft 3x Sensoren(DS18B20) am Raspberry ans laufen zu kriegen. Diese werden zyklisch abgefragt per cronjob und die werte in eine RRD Datenbank gespeichert. Daraus wird dann auch zyklisch je sensor eine Grafik erzeugt, diese sind dann per Webserver einsehbar.

    Nun zu meinem eigentlichen Problem dem cronjob........................
    Ich habe 2x cronjobs eingetragen, einer für das speichern der temp werte(der erste) und der andere zum erzeugen der Grafiken, jedoch wird der zweite nicht ausgeführt.

    Code
    */5 * * * * php5 /root/sh/w1_to_rrd.php > /dev/null 2>&1
    */10 * * * * /root/sh/create_img.sh > /dev/null 2>&1

    Dass der erste funktioniert habe ich geprüft indem ich das änderungsdatum der *.rrd dateien angeschaut habe.
    Beim zweiten hatte sich dieses nicht geändert......ich kann die grafiken nur manuel erzeugen

    Code
    /root/sh/create_img.sh

    hat jemand einen tipp für mich :denker:

    • Offizieller Beitrag

    Was Morob65 damit sagen will, wenn du Probleme mit einem Script hast, dann poste den Inhalt. Warscheinlich wird die Shebang fehlen. (Ist das Programmauch ausführbar?).
    Wenn keine Shebang da ist, kannst du den interpreter auch manuell übergeben

    Code
    */10 * * * * /bin/bash /root/sh/create_img.sh > /dev/null 2>&1

  • /bin/bash
    /bin/sh

    du meinst im eigentlichen skript ?

    das skript startet mit

    Code
    #! /bin/sh

    hier das skript

    ausführbar gemacht habe ich es mit

    Code
    chmod +x /root/sh/create_img.sh

    Einmal editiert, zuletzt von pi_noob15 (16. April 2015 um 09:46)

  • also die Datei wurde bisher nicht erstellt...................
    Ich habe mal die zeit heruntergesetzt

    Code
    */2 * * * * /root/sh/create_img.sh >> /root/cron.log 2>&1€

    jedoch ohne Änderung

    die Attribute sollten passen

    Code
    -rwxr-xr-x 1 root root 1985 Apr 15 20:08 create_img.sh
    -rwxr-xr-x 1 root root  899 Apr 15 13:06 w1_to_rrd.php

    Einmal editiert, zuletzt von pi_noob15 (16. April 2015 um 10:30)

  • Ich hoffe das €-Zeichen in deinem Post #6 im Cronjob ist nur hier passiert, nicht wirklich drin ;)

    Funktioniert das ganze denn manuell? Also das script einfach manuell ausführen in der Shell mit "/root/sh/create_img.sh >> /root/cron.log 2>&1"? Da wirst du auf Fehler ja sofort aufmerksam und musst nicht immer eine gewisse Zeit abwarten.

  • Nur weil ich da so bischen komisch bin, nimm das "nice" weg oder gib den Pfad mit an - so testhalber.

    --
    man ist das System-Anzeigeprogramm für die Handbuchseiten von Linux.


  • Ich hoffe das €-Zeichen in deinem Post #6 im Cronjob ist nur hier passiert, nicht wirklich drin ;)

    doch war es ;) ..... nun wird die datei erstellt, jeodch ohne inhalt.


    Funktioniert das ganze denn manuell? Also das script einfach manuell ausführen in der Shell mit "/root/sh/create_img.sh >> /root/cron.log 2>&1"? Da wirst du auf Fehler ja sofort aufmerksam und musst nicht immer eine gewisse Zeit abwarten.


    ja manuell geht es auch, jedoch bleibt die Log datei auch hier leer...........

    was ich nun festegestellt habe, wenn ich die beiden skripte manuell starte führt er sie zwar aus..... jedoch werden keine aktuellen Temperaturwerte mehr übergeben. Die diagramme werden zwar neu erstellt, die Zeitachse verändert sich, jedoch fehlt der aktuelle Temperaturwert.
    Mittlerweile bin ich echt am Ende............... :helpnew:

    ich glaub ich setz das nochmal neu auf :(

    Einmal editiert, zuletzt von pi_noob15 (16. April 2015 um 11:08)

  • ich habe mittlerweile alles nochmal neu gemacht und konnte das weiter eingrenzen.
    Als ich direkt mit Tastatur und Bildschirm drauf war gings. Jetzt habe ich ihn nur ans netzwerk gehängt und er spinnt wieder, das heißt die Grafiken werden erzeugt jedoch fehlen die gemessenen werte. Wenn ich einzeln in den devices schaue passt alles.

    Hängt das mit dem user vielleicht zusammen?

  • Lade bitte BEIDE aktuellen Codes von dir hier mal rein und alle Befehle die du zum Ausführen genutzt hast. Gerne auch die Ausgabe die in der Shell kommt z.B.

    Sind die Messwerte denn da? Also zeigt das Script diese nur nicht an, oder wurden die mit dem 1. garnicht erfolgreich angelegt, wäre ja auch eine Möglichkeit. Natürlich könnte es am User liegen, dass kommt aber darauf an was du intern für Befehle ausführst. Nachdem der Code da ist kann man sicherlich mehr sagen.

  • im Moment läuft es seit ende letzter Woche problemlos......

    ich habe so eingestellt das er mit grafischer Oberfläche startet, user "pi" ist standardmäßig angemeldet. Dann bin ich mir jedoch nicht mehr 100% sicher ob ich die ganzen konfigurationen unter user "roto"gemacht habe.

    ich lade später mal den aktuellen code hoch........

  • Fein das es jetzt scheinbar läuft, was meinst du mit ganzen Konfigurationen? Es gibt halt gewisse Sachen die du nur als root einstellen kannst, schon gut möglich. Man sollte allerdings nur so viel als root machen wie unbedingt nötig, man sollte nicht alles auf der Root-Ebene durchführen :)

    Wenn der Code dann da ist, schau ich nochmal vorbei ;)

  • *update*

    die geschichte läuft nun seit längerer Zeit stabil :bravo2:


    ich habe für jeden meiner Sensoren eine RRD Datenbank angelegt unter /root/rrd/

    Code
    root@(none):~/rrd# ls
    10-000802c34d2f.rrd  28-0004734d65ff.rrd  28-0004785595ff.rrd

    danach ein Script erstellt "w1_to_rrd.php" welches die Tempwerte der Sensoren abruft und in die Datenbank einträgt. Dieses liegt unter /root/sh/

    Code
    root@(none):~/sh# ls
    create_img.sh  w1_to_rrd.php

    und hat folgenden Inhalt

    nun ein weiteres Skript "create_img.sh" erstellt welches aus den gespeicherten werten Bilder erzeugt und diese im verzeichnis des webservers ablegt.
    Dieses liegt ebenfals unter /root/sh/

    Code
    root@(none):~/sh# ls
    create_img.sh  w1_to_rrd.php

    auch dieses Skript ausführbar gemacht und cronjob zum zyklischen ausführen erstellt.

    Code
    */10 * * * * /root/sh/create_img.sh > /dev/null 2>&1

    im Prinzip war es das, ist auch zu finden auf: http://www.linuxlinus.de/blog/raspberry…8b20-rrd-graph/

    was mich nur unsicher gemacht hat, war dass ich eigentlich immer als root angemeldet war(als normaler user hat mein kein recht einen Ordner in /root/ zu erstellen) und die cronjobs hatte ich auch als root angelegt. Im normalfall ist der user bei mir pi und ich dachte das die cronjobs vom root user dann nicht ausgeführt werden.

    Einmal editiert, zuletzt von pi_noob15 (25. Juni 2015 um 06:52)

  • Was reitet euch eigentlich wenn ihr PHP verwendet um darin Bash/Konsolen Befehle auszuführen? :s

    Also wenn ihr PHP verwendet dann macht das verarbeiten der Datei doch bitte mit PHP Befehlen, ohne exec('cat ...'); . Ansonsten könnt ihr PHP auch gleich ganz weg lassen und direkt ein Bash Script verwenden. Aber dieses gemixe ist verabscheuungswürdig und zudem langsamer.

    Um in bash (bzw der Konsole) mit Kommata-Stellen zu rechnen bedarf es einem extra Programm namens bc

    Code
    sudo apt-get install bc

    Und dann sähe ein bash Script zum Beispiel wie folgt aus:

    "bash"

    [code=php]
    #!/bin/bash

    # 0004734d65ff
    temp=$(grep t= /sys/bus/w1/devices/28-0004734d65ff/w1_slave | awk -F= '{print $2}')
    temp=$(echo "scale=2; $temp / 1000" | bc)
    /usr/bin/rrdtool update /root/rrd/28-0004734d65ff.rrd N:$temp

    # 0004785595ff
    temp=$(grep t= /sys/bus/w1/devices/28-0004785595ff/w1_slave | awk -F= '{print $2}')
    temp=$(echo "scale=2; $temp / 1000" | bc)
    /usr/bin/rrdtool update /root/rrd/28-0004785595ff.rrd N:$temp

    # 000802c34d2f
    temp=$(grep t= /sys/bus/w1/devices/28-000802c34d2f/w1_slave | awk -F= '{print $2}')
    temp=$(echo "scale=2; $temp / 1000" | bc)
    /usr/bin/rrdtool update /root/rrd/28-000802c34d2f.rrd N:$temp

    exit 0
    [/php]..hier siehst du dann auch das der cat Befehl überflüssig ist..

    scale=2 gibt an wie viel Kommata Stellen man möchte.

    Man kann das auch weiter verkürzen da das erste temp= eigentlich auch überflüssig ist:
    [code=php]
    #!/bin/bash

    # 0004734d65ff
    temp=$(echo "scale=2; $(grep t= /sys/bus/w1/devices/28-0004734d65ff/w1_slave | awk -F= '{print $2}') / 1000" | bc)
    /usr/bin/rrdtool update /root/rrd/28-0004734d65ff.rrd N:$temp
    [/php]

    Und noch kürzer wärs so:
    [code=php]
    #!/bin/bash

    # 0004734d65ff
    /usr/bin/rrdtool update /root/rrd/28-0004734d65ff.rrd N:$(echo "scale=2; $(grep t= /sys/bus/w1/devices/28-0004734d65ff/w1_slave | awk -F= '{print $2}') / 1000" | bc)
    [/php]

    Man könnte auch automatisch alle verfügbaren 1wire Sensoren auslesen, ohne diese im Script fest/hardcoded definieren zu müssen - zumal Du die RRD Datei auch nur nach der 1wire ID benennst..
    [code=php]
    #!/bin/bash

    # for each available sensor...
    while read sensor; do
    echo $sensor
    temp=$(grep t= /sys/bus/w1/devices/$sensor/w1_slave | awk -F= '{print $2}')
    temp=$(echo "scale=2; $temp / 1000" | bc)
    /usr/bin/rrdtool update /root/rrd/$sensor.rrd N:$temp
    done < <(cat /sys/devices/w1_bus_master1/w1_master_slaves)

    exit 0
    [/php]

    Das ist doch viel cooler oder nicht? :angel:

    In PHP Sähe das wie folgt aus:

    &quot;php&quot;

    [code=php]
    <?php
    $lines = file_get_contents('/sys/bus/w1/devices/28-0004734d65ff/w1_slave');
    $boom = explode('t=', $lines);
    exec("/usr/bin/rrdtool update /root/rrd/28-0004734d65ff.rrd N:" . round(floatval($boom[1] / 1000), 2));
    ?>
    [/php]

    Für das 2.Beispiel ohne hardcoded 1wire ID:
    [code=php]
    <?php
    $lines = file('/sys/devices/w1_bus_master1/w1_master_slaves');
    foreach($lines AS $sensor) {
    $lns = file_get_contents('/sys/bus/w1/devices/' . $sensor . '/w1_slave');
    $boom = explode('t=', $lns);
    exec("/usr/bin/rrdtool update /root/rrd/" . $sensor . ".rrd N:" . round(floatval($boom[1] / 1000), 2));
    }
    ?>
    [/php]

    file_get_contents() gibt den kompletten Inhalt der Datei in einem String zurück.
    file() erstellt ein Array wo jedes Element eine Zeile enthält.

    Eine weitere Möglichkeit wäre auch:
    [code=php]
    $lines = file('/sys/devices/w1_bus_master1/w1_master_slaves');
    foreach($lines AS $sensor) {
    $lns = file('/sys/bus/w1/devices/' . $sensor . '/w1_slave');
    if (preg_match("/t=(.*)/", $lns[1], $match)) {
    exec("/usr/bin/rrdtool update /root/rrd/" . $sensor . ".rrd N:" . round(floatval($match[1] / 1000), 2));
    }
    }
    [/php]dies wäre auch der richtige Ansatz um mein Schlusskommentar zu beachten..


    Problematisch bei dem ganzen (auch schon bei Deiner Variante) ist allerdings das ein 1wire Sensor auch mal nicht Ready sein kann, was man dann am "NO" erkennen würde - deshalb wärs besser wenn man sicherstellen würde das in der ersten Zeile auch wirklich "YES" steht, also der Sensor auch Ready ist.
    Auch sollte man verifizieren dass das Auslesen erfolgreich war bevor man stumpf "rrdtool update" ausführt, denn sonst vermurkst man sich die Datenbank.

  • So...... nachdem ein Stromausfall meine Filesystem der SD Karte zersört hat habe ich wieder alles neu aufgesetzt und gleich auf nen USB Stick ausgelagert.

    Nun habe ich aber das problem dass die Grafik eines Sensors keine Werte enthält. Ich habe auch direkt im W1 device geschaut, dort passt alles

    Code
    pi@raspi4temp /sys/bus/w1/devices/28-0004734b48ff $ cat w1_slave
    6e 00 55 00 7f ff 0c 10 ad : crc=ad YES
    6e 00 55 00 7f ff 0c 10 ad t=6875

    entweder der Wert wird nicht in die Datenbank geschrieben oder das Skript für die Erstellung der Grafiken hat nen Schuss... ich konnte selbst aber keinen Fehler finden:

    w1_to_rrd.php zum schreiben der Werte in die Datenbank


    hat jemand eine Idee :daumendreh2:

Jetzt mitmachen!

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