PHP-Script wird im Crontab nicht vollständig verarbeitet

  • hallo zusammen,


    ich hänge hier seit zwei tagen an einem für mich unlösbarem problem..
    ich würde gerne die werte aus einer datei gerne in meine mysql-db schreiben, wofür ich eigens ein php script geschrieben habe. das script funktioniert einwandfrei, wenn ich es im browser aufrufe.. sobald ich es jedoch als job im crontab anlege, wird nur der erste teil abgearbeitet.


    hintergrund:
    ich habe derzeit einen temperatursensor (ds18b20) und einen luftfeuchtigkeitssensor (dht22) an meinem raspi angeschlossen. für den dht22 habe ich den treiber von technion im einsatz (https://github.com/technion/lol_dht22). der abruf der daten funktioniert einwandfrei, muss allerdings die ausgabe in eine datei schreiben, damit ich es mit php auslesen kann.
    die ausgabe landet bei mir derzeit in /var/www/data/gpio1.


    hier das php-script:


    und gleich darunter wird diese datei ausgelesen:

    Code
    #Schreibe in DB
    */2 * * * * wget --spider "http://localhost/measure.php"


    er schreibt, wie gesagt, nur die daten vom ds18b22 in die datenbank und rührt sozusagen den teil vom dht22 gar nicht an..
    mich verwundert es, dass es jedoch über browseraufruf problemlos funktioniert...


    ich hoffe, ihr könnt mir helfen.


    mfg
    rob0r7
    [hr]
    ok, hat sich erledigt.


    problem war folgendes:
    technisch habe ich im crontab festgelegt, dass die werte vom dht22 jede minute in eine datei geschrieben werden sollen..
    wiederum habe ich festgelegt, dass diese datei jede minute auch ausgelesen werden soll.. dadurch , dass die datei im gleichen moment wo sie ausgelesen wurde auch beschrieben wurde, war sie , so denke ich, gesperrt, was dazu geführt hat, dass keine werte in die db gelegt werden konnten.

    Edited once, last by rob0r7 ().

  • Was ist der 1.Teil und was ist der 2.Teil? Das kann ich aus deinem Beitrag nicht rauslesen was damit gemeint ist :huh:


    Dein Code ist aber auch aufgrund der fehlerhaften Einrückungen schwer zu lesen


    Und warum du ganz am Anfang im PHP Script loldht aufrufst und dessen Ausgabe in /dht22log/gpio1 umleitest, diese Datei später aber nicht mehr verwendest verwirrt mich ebenfalls... Wenn das nur eine Temporäre Datei ist solltest du diese lieber in ein tmpfs schreiben damit nicht jede Minute die SD damit belastet wird - sonst wird die SD nicht wirklich lange leben.


    Also wieso du einen Crontab Eintrag für loldht hast und dieses auch identisch (bis auf die Umleitung der Ausgabe) im PHP Script aufrufst verwirrt mich enorm


    Und btw: Die Ausgabe eines exec(); Befehls kanns du auch in ein Array schreiben lassen, also wäre dieser Umweg über eine Datei eigentlich unnötig. Siehe dazu: http://www.php.net/manual/de/function.exec.php
    ..und damit sollte sich dein Problem dann eigentlich auch schon erledigt haben..

  • Der zweite Teil beginnt, wo der Auslesevorgang für den DHT22 gestartet wird (//Sammle DHT22-Sensordaten).


    Der Aufruf von loldht am Anfang kann ausgeblendet werden.. Das war mal ein älterer Versuch, der nie funktionierte.


    Das Aufrufen des loldht Scripts an sich hat über PHP-Ebene leider nie funktioniert.


    Das Problem hat sich , wie gesagt , bereits erledigt.
    Mein Fehler war es, dass ich quasi zeitgleich eine Datei geschrieben und ausgelesen habe. Ich weiß allerdings nicht, ob man diesen Mechanismus im Crontab ändern kann..


    Danke für deinen Hinweis!

  • Der Aufruf von loldht am Anfang kann ausgeblendet werden.. Das war mal ein älterer Versuch, der nie funktionierte.


    Das Aufrufen des loldht Scripts an sich hat über PHP-Ebene leider nie funktioniert.


    Das könnte daran liegen dass der apache2 Benutzer www-data nicht einfach so Befehle über sudo ausführen darf... Das wäre ziemlich übel wenn dem so wäre
    Hast du dafür einen Eintrag über visudo gemacht? Wenn ja wie sah der aus?



    Mein Fehler war es, dass ich quasi zeitgleich eine Datei geschrieben und ausgelesen habe. Ich weiß allerdings nicht, ob man diesen Mechanismus im Crontab ändern kann..


    Naja über Crontab kann man als minimum nur Minuten nutzen, du könntest also das auslesen des Sensors um 00 auslösen und das auswerten via PHP um 01


    Allerdings würde ich lieber den nativen Weg gehen und alles übers PHP Script zu regeln und das würde halt erfordern einen sudoers Eintrag für den loldht Befehl einzufügen, allerdings als NOPASSWD .. also zum Beispiel:

    Code
    www-data ALL=NOPASSWD:/lol_dht22/loldht


    Desweiteren würde ich darauf verzichten die Ausgabe in eine Datei umzuleiten bzw zu schreiben, sondern möglichst viel direkt in PHP zu machen:
    [code=php]exec('sudo /lol_dht22/loldht 1', $output, $return_var);[/php]
    Die Ausgabe befindet sich dann im Array $output

  • Ich probiere deinen Vorschlag für den nativen Weg heute Abend mal aus.


    Wäre klasse, wenn das so funktioniert.


    Vielen Dank erst mal :)


    EDIT:
    ja, in sudoers hTte ich folgenden Eintrag mit visudo gemacht:


    %users ALL=NOPASSWD: /lol_dht22/loldht

    Edited once, last by rob0r7 ().