Fragen zum Start externer Progs per "IPS_Execute()" vs. "exec()"

Hallo,
folgende Frage an die PHP-Freaks:

wenn ich in einem IPS-Script zyklisch „wget“ aufrufe, um damit ein CAM-Bild abzuholen mit folgendem Befehlsstring


C:/progs/GnuWin32/bin/wget.exe -c -r -nv -nd -np -p --follow-tags=img http://login:password@192.168.x.x:port/top.htm

"login", "password", "x.x", "port" sind natürlich im Einsatz reale Werte

so klappt, ausgeführt mit „exec()“ dieses auch bestens. Einzig nervt das zyklisch aufpoppende schwarze Konsolenfenster

Versuche ich das per „IPS_Execute()“, welches ja lt. Beschreibung Möglichkeit bietet, das ohne Consolenfenster laufen zu lassen, bekomme ich das dort einfach nicht zum Laufen.

Auch wenn ich das Fenster erstmal enable, den Aufruf in zwei Strings trenne (Programm mit Pfad und Parameter getrennt) - es arbeitet einfach nicht.

Konkret: Das Konsolen-Fenster poppt auf, aber das Ergebnis-File erscheint einfach nicht!

Hat da irgend wer ne Idee, was ich falsch mache? Rechte können es m.E. nicht sein, denn 1. läuft das auch unter Admin-Rechten nicht, 2. klappt es ja mit „exec()“…

Muß bei „IPS_Execute()“ noch was anderes beachtet werden? Wie ist das zu verstehen mit den beiden dort vorhandenen Input-String-Parametern (Programm / Parameter), MUSS ich das trennen? KANN ich das trennen (in der Hilfe in der Doku gibt es auch Beispiele, wo Parameter im 1. String zusammen mit dem Befehl kommen)? WANN muß ich das trennen in die zwei Strings?

Das „IPS_Execute()“ funktioniert übrigens mit „tail -f“ bestens, ist also auch wohl nicht korrupt oder sowas.

Gibt es im Gegenzug vielleicht eine Möglichkeit, beim „exec()“-Befehl das PopUp-Fenster zur Laufzeit zu verhindern?

Gruß Gerd

Fehler eingegrenzt.

„IPS_Execute()“ scheint sich nicht um zuvor im Script per „chdir($zielpfadtemp);“ eingestellte aktuelle Pfade zu kümmern. Stattdessen liegen die Ergebnisdateien im IPS-Hauptverzeichnis!

Manchmal muß man ein Problem nochmal sauber formulieren, um selber neue Ansätze zu sehen… :wink:

Gruß Gerd

PS Trotzdem wär mal interessant, ob/wie man das aktuelle Verzeichnis beim „IPS_Execute()“ einstellen kann, bzw. wie genau das mit den beiden Befehlsstrings nun zu verstehen ist.

bei exec kommt definitiv das Konsolenfenster, aber vielleicht hilft dir dieser Beitrag: klick

Hast du mal versucht die Slashes zu escapen?
Oder verwende alternativ mal einfache Anführungszeichen ’ statt der Doppelten ". dann sollte das mit dem escapen entfallen.

Das mit dem Trennen der Parameter ist normalerweise dafür da, dass man checken kann ob die Datei, die aufgerufen werden soll, existiert. Denn die Datei „tail -f“ wirds ja nicht geben. Aber was paresy da genau macht kann ich dir leider nicht beantworten.

Gruß,

Toni

Hallo Gerd,

in der Beschreibung zum IPS_Execute(…)-Befehl ist dokumentiert, wo das Ergebnis erscheint.

Gruß
HJH

Hallo HJH
sorry, ich habe natürlich vorher aufmerksam die Doku gelesen und nun noch einmal. Aber ich finde genau dazu dort keine Aussage!

Nochmal das Problem:
Es geht nicht um den Std-Out-Stream des Systemaufrufs selber, sondern darum, welches aktuelle Verzeichnis bei Ausführung des IPS_Execute(…)-Befehls herrscht, bzw. wie der einstellbar ist.

Das aufgerufene „wget“ legt während seiner Laufzeit selber, ausgehend vom vorher herrschenden aktuellen Verzeichnis, Dateien und Verzeichnisbäume an.

Mit „exec“ aufgerufen, beachtet es brav den vor dem „exec“-Befehl eingestellten Pfad und beginnt dort, seine Daten abzulegen.

„IPS_Execute(…)“ dagegen schert sich einen Hasenpups darum, was da vorher eingestellt wurde, und legt alles brav ab dem IPS-Homeverzeichnis an bzw. ab. (übrigens auch nicht etwa „…\IP-SYMCON\scripts“, von wo aus es ja gestartet wurde! Also muß das da Befehls-intern ja bewußt gesetzt worden sein?)

Der Returnwert des Aufrufes interessiert in diesem Zusammenhang gar nicht, das passiert alles zur Laufzeit des aufgerufenen Programms.

Oder bin ich wirklich blind und kanns in der Doku nicht sehen, wie das einzustellen geht? Dann Sorry! (und: Bitte einen Tip geben)

Gruß Gerd

Hallo Toni,
habs nun gelesen. Ist das mit dem Speicherproblem bei IPS_Execute(…) immer noch so? Oder hat sich das inzwischen seit 2006 gegeben / war das RRD-verursacht? Wenn doch, dann kann ich das ja generell vergessen, da ich mehrmal die Minute abrufen will… :eek:

Ich probiere erstmal, ob ich dem wget als Parameter bewußt beigebracht bekomme, wo es seine abgeholten Daten hinzuschreiben hat. Gibt ja genug Parameter dort und es ist eindeutig die Ursache: Alles liegt im IPS-Verzeichnis.

Das da einfach so im IPS-Verzeichnis liegen lassen, wär zwar denkbar, hat aber folgenden Nachteil:
Ich weiß ja vorher i.d.R. nicht, welche eingebetteten Dateien eine Webseite hat. Hinterher einfach mal einen ganzen Verzeichnisbaum bereinigend weglöschen, das ist easy. Mal eben das IPS-Verzeichnis inkl. aller Unterverzeichnisse löschen, das dürfte dagegen …ähmmm… nichttriviale Folgen haben. :rolleyes:

…und Löschen muß ich wiederum, denn wget ist so eigen-intelligent, das es bemerkt, wenn eine Datei schon gezogen wurde, und holt die nicht nochmal. Das in der (namensgleichen / gleiche Bytezahl) Datei sich der Name der eingebetteten Grafik nur an einer Stelle der Session-ID geändert hat (Länge gleich), hat die Gesamtlänge der Datei nicht geändert --> nicht neu --> nicht erneut geholt.

Außerdem mag ich keinen Datenmüll im (IPS)-Root-Verzeichnis rumliegen haben… Auch: Man stelle sich vor, da liegt auf der gegrabbten Webseite eine Datei „settings.xml“, und wget holt die brav heim…

Funzt. Workaround fürs „wget“ (Zitat aus Hilfe zum Parameter):


 -P,  --directory-prefix=PREFIX   save files to PREFIX/...

also für "per wget abgeholte Daten ablegen unter „d:\Data\Cam3 mp“ lautet der zu ergänzende Parameter-String dann

… -Pd:\Data\Cam3 mp\

Gruß Gerd

Hallo Gerd,

wenn mit IPS_Execute ein Programm abgearbeitet wird, so wird zuerst eine CMD-Session (DOS-Fenster) gestartet. In diesem läuft das Programm ab und nach Beendigung wird die Session wieder geschlossen.

Jeder weitere IPS_Execute Befehl startet wieder eine neue Session. Damit wird klar, dass jeder IPS_Execute Befehl in einem eigenen Kontext abgearbeitet wird. Selbst gleichzeitig laufende Sessions wissen nichts von der Existenz der anderen.

Wenn Du also nicht willst, dass die Wirkung des chdir() Befehls verlorengeht, musst Du dafür sorgen, dass alle auf einander aufbauenden Befehle im selben Kontext ablaufen.

Als Lösung käme hier ein Batch in Frage, das dann von IPS_Execute aufgerufen wird.

Gruß
HJH

ahhhh… dann ist das klar.

Danke für die Info :slight_smile:
Gerd