PHP Task sehen ob läuft
-
AndyKL -
21. Januar 2016 um 10:15 -
Erledigt
Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
-
-
PHP Task sehen ob läuft? Schau mal ob du hier fündig wirst!
-
Nein, so ohne weiteres geht das nicht. Wie waere es, wenn du uns mal deine Aufgabe schilderst, vielleicht gibt's eine anderen Ansatz?
-
Ich glaube du kannst mit dem PS Befehl nur laufende Prozesse sehen. Das wäre in dem Fall dann "nur" PHP glaub ich. Also darüber bekommst du nicht den Skriptnamen. Wieso lässt du dein Skript nicht in ein logfile schreiben?
-
Wie waere es, wenn du uns mal deine Aufgabe schilderst, vielleicht gibt's eine anderen Ansatz?
Ich schildere gerne meine Aufgabe, muss aber dazusagen, dass es in diesem Forum bereits einen besseren Ansatz gab, dieser aber ziemlich kompliziert war und ich nicht weiter kam.Ich habe an meinem Garagentor 2 REED Kontakte, die den Status für Tor auf und Tor zu überwachen.
Ich habe dazu in PHP eine dauerschleife mit sleep 30 und sollte sich der Zustand ändern (also von "Tor zu" auf "Tor auf") dann wird es in mySQL weggeschrieben. Über logfile sehe ich es dann.
Mit Python würde es sicherlich besser und professioneller gehen, allerdings ist es nicht einfach, da ein Script zu schreiben, siehe:
Crontab mit PHP
Automatisch zusammengefügt:
Wieso lässt du dein Skript nicht in ein logfile schreiben?
Eine sehr gute Idee, warum bin ich nicht selbst draufgestoßen.
Habe den Skipt ergänzt um Logfile und festgestellt, dass nach Neustart von Raspberry
crontab die PHP gar nicht startet:@reboot /usr/bin/php /var/www/Garagentor3.php
Wenn man den PHP Script dann einmal aufgerufen hat, dann läuft er in Dauerschleife.
Nur warum, startet Crontab es nicht? -
Das Problem, was ich dir in dem anderen Thread auch schon beschrieben habe, ist das du mit PHP auch einen Zustand verpassen kannst. Wenn es einen Flankenwechsel vom GPIO gibt wird der nicht solange Bestand haben bis irgend ein Script diesen ausgelesen hat. Es wäre also besser und sinnvoller das ganze via Python und Interrupt zu lösen.
Davon abgesehen kennen wir nicht dein (aktuelles) Script. Ohne das zu kennen kann man nur raten.
Um aber trotzdem auf deine Frage hier einzugehen: Jeder Prozess erhält eine eindeutige Prozess-ID zugewiesen. Anhand dieser PID kann man Einfluss auf den Prozess ansich nehmen wie zB diesen killen.
Mithilfe des Befehls "ps" zeigt man sich alle laufenden Prozesse an. Für den Befehl gibt es aber auch noch Parameter die man dem Befehl übergeben kann, so wäre zB "ax" sinnvoll. Näheres dazu kann man in der manual-page nachlesen: man ps
Anhand des Dateinamens des Scripts kann man die Ausgabe des "ps" Befehls dann auch filtern sodass man nur sein gesuchtes Script angezeigt kriegt: ps ax | grep Script.php
Nun muss man aber auch den grep Befehl ansich filtern da es sonst immer einen Treffer gäbe, also den Befehl erweitern: ps ax | grep -v grep | grep Script.php
Man kann aber auch einen anderen Befehl nutzen: pidof Script.phpNur, was bringt dir diese Information? Was hast du damit nun vor? :s
-
Mithilfe des Befehls "ps" zeigt man sich alle laufenden Prozesse an. Für den Befehl gibt es aber auch noch Parameter die man dem Befehl übergeben kann, so wäre zB "ax" sinnvoll.Hallo,
den Befehl ps -ax wende ich auch normalerweise an (siehe #1).
Man sieht dort Pythonscripte, aber halt nicht PHP.Wenn mein Fehler gelöst wäre mit dem Cronjob, dann hätte ich einen Zustand mit dem ich leben könnte. Fakt ist, dass Crontab den Befehl nicht ausführt:
@reboot /usr/bin/php /var/www/Garagentor3.php
Ich gebe Dir ganz klar recht, dass Python die bessere Wahl ist.
Hier ist noch mal der Script, der die REED Kontakte überprüf und mit Print ausgibt:Python
Alles anzeigen#!/usr/bin/python3 import RPi.GPIO as GPIO import time GPIO.setwarnings(False) #GPIO Layout verwenden (keine Pin) GPIO.setmode(GPIO.BCM) # GPIO 5 auf Input setzen GPIO.setup(5, GPIO.IN) # Dauersschleife while 1: # GPIO lesen if GPIO.input(5) == GPIO.HIGH: print("GPIO5 ist HIGH") time.sleep(1) else: print("GPIO5 ist LOW") time.sleep(1)
Ich würde diesen Script gerne so weit verändern, sodass nur dann print erscheint, wenn sich der Status ändert z.B. von HIGH auf LOW, also einmalig.
Sollte das funktionieren, wird das nächste sein, mit mySQL eine Verbindung aufzubauen. Dazu muss glaube ich etwas nachinstalliert werden. -
Dieses Python Script behandelt die "poll" Methode, verursacht in dem jetzigen Zustand aber auch 100% CPU Auslastung da die while ungebremst rotiert. Das sleep ist also an der falschen Stelle.
Ich sprach aber nicht von Polling sondern Interrupt.Wenn über "ps aux" kein "php" auftaucht dann läuft es auch nicht. Dabei muss man aber auch 2 Dinge unterscheiden:
- Ein PHP Script was über Konsole ausgeführt wird.
- Ein PHP Script was über einen Webserver bzw Webbrowser aufgerufen wird.Letzteres wird nicht über "ps aux" angezeigt da es kein eigenständiger Prozess ist.
Ich versteh aber auch nicht wieso du hier noch einen Thread zum selben Thema auf machst - in dem anderen habe ich bereits versucht dir einige Grundlagen nahezulegen die du dann aber leider ignoriert hattest, wie zum Beispiel Beitrag#6
Aus dem PHP Script Auszügen in Beitrag#3 (in dem anderen Thread) konnte man auch nicht wirklich schlau werden da die Hälfte fehlt aber du es auch nicht in CODE gepostet hast, so lässt es sich nur schwer verstehen/lesen.. Aber wie gesagt, nannte ich dir in Beitrag#4 einen Link den du dir durchlesen solltest - haste dann aber nicht beherzigt...
Wenn du es in Python machen willst dann versuch es bitte auf die Weise wie ich in Beitrag#6 erwähnt hatte.
Wenn du es in PHP machen willst dann beachte das was ich in Beitrag#4 verlinkt hatte.Wenn du dann Fragen hast zeig uns bitte deinen aktuellen Stand des eigenen Codes bzw der Versuche.
-
hast du mal ins syslog geguckt, ob der cron gestartet wird?
hast du #!/usr/bin/php am Anfang deines scripts?
-
Da er die Datei direkt an den Interpreter übergibt brauch er keinen Shebang da der dann sowieso ignoriert wird.
-
Ich habe das Thema Programmieren in Python nicht weiter verfolgt, weil es für mich ganz einfach zu schwer war. Ich habe eine Lösung in PHP, auch wenn sie evtl. leider viel Ressourcen braucht.
Was ich jetzt nur noch brauche, ist das einmalige Starten der PHP beim Systemstart.Wo finde ich das Syslog, in dem ich gucken kann, ob Crontab gestartet wurde?
#!/usr/bin/php habe ich an der Seite angehängt. Hier im Forum gab es bereits Diskussionen über Crontab und PHP, doch leider kam ich da nicht weiter.
-
=> /var/log/syslog
Zeig doch mal dein derzeitiges PHP Script - bitte in CODE
-
Im Systemlog finde ich nur dieses:
Jan 22 11:19:05 Raspberry /USR/SBIN/CRON[2100]: (root) CMD (/usr/bin/php /var/www/Garagentor3.php)
Jan 22 11:19:05 Raspberry /USR/SBIN/CRON[2086]: (CRON) info (No MTA installed, discarding output)
Jan 22 11:19:07 Raspberry /USR/SBIN/CRON[2083]: (CRON) info (No MTA installed, discarding output) -
Das bedeutet, es gab beim Ausführen ein Problem oder eine Ausgabe, es ist aber kein MailTransportAgent eingestellt und somit weiß cron nicht was er mit der Ausgabe oder dem Fehler anfangen soll
Was passiert denn wenn du den Befehl manuell in der Konsole ausführst?
-
Was passiert denn wenn du den Befehl manuell in der Konsole ausführst?Das geht es
-
Bitte posten - wie du es ausführst und mögliche ausgaben - copy&paste
-
Treffer: es geht nicht!
Es kommt:Line 18:
Es waren auch 2 andere Fehler da, die ich entfernt habe!
-
Wenn es manuell nicht funktioniert kann es über crontaab auch nicht gehen ...
Da wir bis dato dein aktuelles Script nicht zugesicht bekommen haben konnten wir dazu auch nichts sagen - also das nächste mal bitte selbstständig posten
PS: file_put_contents
PPS: Es gibt unten rechts einen "Bearbeiten" Knopf. Bitte nutzen. -
Ich wollte niemanden verwirren mit dem Script, sorry
PHP
Alles anzeigen#!/usr/bin/php <?php ################# Die Seite enthält eine Dauerschleife, läuft also ständig und prüft alle x Sekunden, ob sich die Torposition verändert hat ################# wenn ja, werden diese Informationen in DB (mySQL) geschrieben ################# mySQL: Auslesen des Zustands, ob Tor zu oder auf ist set_time_limit(0); // Script läuft zeitlich unbegrenzt while(true) { // Endlosschleife ################# Logfile erstellen, um z.B. zu sehen, ob Seite läuft: $logdatei=fopen("/var/www/Files/logfile_Garagentor3.txt","a"); fputs($logdatei, date("d.m.Y, H:i:s",time()) . #", " . $_SERVER['HTTP_USER_AGENT'] . ", " . $var ."\n" ######Line 18 ); fclose($logdatei); ################# ENDE: Logfile erstellen, um z.B. zu sehen, ob Seite läuft ##### Lesen von Event, letzten Eintrags: $servername = "localhost"; $username = "123"; $password = "xyz"; $dbname = "HomeAutomation"; // Create connection: $conn = new mysqli($servername, $username, $password, $dbname); // Check connection: if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql2 = "select Event from Garagentor order by id desc limit 1;"; $result = $conn->query($sql2); $result = $conn->query($sql2); if ($result->num_rows > 0) { // output data of each row/zeile while($zeile = $result->fetch_assoc()) { // mach so lange Daten da sind $var = "". $zeile['Event'] . ""; #echo $var; } } else { echo "0 results in table Garagentor"; } ##### Ende Lesen von Event, letzten Eintrags ?> <?php ################# mySQL: Vorbereitung für Daten wegschreiben (INSERT) #################### $datum = date("Y-m-d"); $zeit = date("H:i:s"); #echo $datum; #echo $zeit; $servername = "localhost"; $username = "123"; $password = "xyz"; $dbname = "HomeAutomation"; // Create connection: $conn = new mysqli($servername, $username, $password, $dbname); // Check connection: if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } if (exec("sudo gpio -g read 3") == 0) { #dann befindet sich das Tor oben, d.h. Magnet liegt oben an echo "OPEN"; if($var <> "Tor offen") { #wenn zuletzt gelesener Eintrag (Event) ungleich "Tor offen" dann... ######## Daten in mySQL wegschreiben: $sql = "INSERT INTO Garagentor (Datum, Uhrzeit, Event) VALUES ('$datum', '$zeit', 'Tor offen')"; if ($conn->query($sql) === TRUE) { #echo "Insert hat geklappt für: Tor offen<br>"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } } else { #echo "Kein Insert in die Datenbank nötig"; } } elseif (exec("sudo gpio -g read 5") == 0) { #dann befindet sich das Tor unten, d.h. Magnet liegt unten an echo "CLOSE"; if($var <> "Tor geschlossen") { #wenn zuletzt gelesener Eintrag (Event) ungleich "Tor geschlossen" dann... ######## Daten in mySQL wegschreiben: $sql = "INSERT INTO Garagentor (Datum, Uhrzeit, Event) VALUES ('$datum', '$zeit', 'Tor geschlossen')"; if ($conn->query($sql) === TRUE) { #echo "Insert hat geklappt für: Tor geschlossen<br>"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } } else { #echo "Kein Insert in die Datenbank nötig"; } } else { echo "Tor bewegt sich..."; } print "Da bin ich\n"; $conn->close(); #saubere Trennung der Verbindung zu Datenbank sleep(20); #Prozess für 20 Sek anhalten } # While: Endlosschleife ?> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <title>Garagentor</title> </head> <body> </body> </html>
Automatisch zusammengefügt:
Wenn es manuell nicht funktioniert kann es über crontaab auch nicht gehen ...
Manuel funktioniert es jetzt zu 100%, es gibt keine Fehlermeldung mehr.Doch als Cronjob will es nicht gehen.
Jetzt mitmachen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!