IP-Symcon als Management-Zentrale für CMD-/Batch-Scripte nutzen
Vor über einem Jahr hab ich mal auf die Schnelle eine automatisierte Video-Erzeugung via Batch-Script gebaut, die meine in rauhen Mengen anfallenden Webcam-Bilder zu Zeitraffer-Videos zusammenklöppelt. Täglich! Allerdings gab es in diesem Script einige Abhängigkeiten und Variablen, die ich gern aus IP-Symcon heraus gemanaged bzw. übergeben hätte. Also habe ich die komplette Lösung innerhalb der IP-Symcon Plattform in PHP aufgebaut und nur noch das absolut Notwendige in die Batch-Datei geschoben. Diese Batch-Datei wiederum wurde im PHP-Script dynamisch erzeugt, auf die Platte des Servers geschrieben und dann von selbigem Script als Batch-Job gestartet. Das Ganze läuft bis heute so dermaßen entspannt und pflegeleicht, dass ich inzwischen einige solcher Lösungen produziert habe und damit die Aufgabensteuerung vom WIN Server arbeitslos wird. Zumindest, was meine persönlichen Wünsche angeht.
Am Anfang fand ich diese Lösung ziemlich uncool. Aber inzwischen ist das eine meiner Lieblings-Methoden, um auf dem Server irgendwas, was nicht direkt aus IP-Symcon heraus erreichbar ist, ablaufen zu lassen.
Das Konstrukt
Nochmal zusammengefasst:
- Der eigentliche Programm-Ablauf findet in IP-Symcon via PHP statt
- In diesem PHP-Script wird der Inhalt einer Batch-Datei erzeugt
- Das PHP-Script schreibt den Inhalt in eine Batch-Datei
- Das PHP-Script startet diese Batchdatei
Zur Sache: ein konkretes Lösungsbeispiel
Die Aufgabe lautet: regelmäßig die Logdaten vom Webserver ins PIWIK zu importieren. Zu beachten ist hier, dass die Logfiles das Tagesdatum im Filenamen haben und damit dynamisch sind. Eigentlich ist das noch recht einfach mit einem Batch-Script zu machen. Aber wenn ich diesen Programmablauf ins IP-Symcon integriere, könnte ich das mit anderen Abhängigkeiten verknüpfen und ggf. auch vom Webfrontend aus steuern. Wenn ich will. Im Moment will ich aber nur, dass es läuft.
Also schnell ein Script zusammen gedengelt, welches die Variablen für den Tag, Monat und Jahr füllt (wir erinnern uns: die Logfiles des Webeservers haben im Filenamen das Tagesdatum stehen, Beispiel: ‚u_ex141210.log‘), eine Mini-Funktion (‚function CMD_Content ()‘) geschrieben, die den Inhalt der Batch-Datei erzeugt. Dieser Funktion wird Tag, Monat, Jahr sowie ein paar Script-Parameter (die geheim sind ;-) übergeben, zum Dank gibt die Funktion einen String mit dem vollständigen Inhalt des Batch-Scipts zurück. Im Bild wird dieser String dann in Zeile 27 mit Hilfe einer weiteren Funktion (‚function writeFiles()‘) auf die Festplatte des Servers geschrieben. Unmittelbar danach wird diese Batch-Datei mit Hilfe von ‚IPS_Execute‚ (Zeile 30) als eigenständiges Programm gestartet und sich selbst überlassen – sprich: das PHP-Script wartet nicht auf die Batch-Datei. Wichtig ist hierbei nur, dass die Batch-Datei auf dem Server gestartet werden muss, in dem auch IP-Symcon wohnt.
Wenn ich will, kann ich noch beliebige Timer unter das Script hängen und nach Herzenslust x-mal am Tag aufrufen lassen. Oder Abhängigkeiten einbauen (z.B. starte das >Script nur, wenn ich zu Hause bin. Macht wenig Sinn – aber Spaß).
Lessons learnt:
Also im Kontext der IP-Symcon Konsole eine sehr komfortable Lösung, die wesentlich flexibler ist, als das Gerödel über die Windows-Aufgabensteuerung einzutüten.
PHP-Script erzeugen, Filenamen für die Batch-Datei ausdenken (oder googeln), Pfad zur zukünftigen Batchdatei angeben, Batchdatei-Inhalt zusammendengeln, auf die Platte schreiben lassen und Schuss. Feddich. Mehr braucht man nicht. Es sei denn, man will spielen ;-)
Funktion ‚writeFiles‘:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
function writeFiles($filename, $path, $content) { /* Funktion erzeugt aus den 3 Übergabe-Parametern ein File und schreibt es auf die Festplatte. Wenn der übergebene Pfad nicht vorhanden ist, wird dieser automatisch angelegt. Übergabe-Parameter: 1. Filename (z.B. 'BesispielScript.php') 2. Pfad zum File (da, wo das File hingeschrieben werden soll, Beispiel: 'C:\tmp') 3. File-Inhalt (Beispiel: 'Ich bin der Script-Inhalt<!--?php echo "ich bin ein Script\n"; ?-->') */ // Ordner anlegen, wenn nicht vorhanden if (!is_dir($path)) mkdir ($path , 0777, true); // schreiben der Content-Datei $file = $path.'\\'.$filename; $handle = fopen($file,"w"); fwrite($handle, $content); fclose($handle); } |
Hallo Raketenschnecke,
ich vermute, Dein batch-script ist für Windows gemacht. Denn ich hatte Schwierigkeiten, es auf dem Raspi umzusetzen. Es war mir nicht möglich, eine Datei über Pfad und Name anzulegen. Ich mußte mit chdir zuerst dorthin wechseln. Dann konnte ich dort schreiben.
Danke für die Idee. Die Sache mit dem batch werde ich auch noch ausprobieren.
Grüße, Gerhard
Hi Gerhard,
ja, in der Tat: das ist für die Windows-Umgebung gedacht ;-)