Hallo
Ich habe ein sooo kleines Problem, aber überhaupt keinen Plan von
Batch-Programmierung unter Linux. Also denke bitte keiner, er hätte
die Lösung und sagt sie aber nicht, weil die zu einfach wäre und daher
nicht die Lösung sein kann (-;
Folgendes:
Ich habe ein über den Webserver (also vom Browser) aufgerufenes
PHP-Script, welches per exec() (oder auch system() oder popen() - das
Problem ist immer dasselbe) ein weiteres PHP-Script aufruft, das im
Hintergrund eine sehr aufwendige Aktion durchführt, die weit länger
dauert kann, als das erste Script warten kann/will.
Das sind als Kommando dann so aus:
$cmd = "/usr/local/bin/php -f /..../test_called.php > $fileOutput &";
system( $cmd );
Auf manchen Systemen funkioniert der Aufruf des zweiten Scriptes
nicht, sondern es wird immer wieder das erste aufgerufen.
Konkret kenne ich zwei Systeme, bei denen es nicht funktioniert und
beide verwenden PHP nicht als Modul, sondern als PHP-CGI.
Mein Provider (der eines der beiden Systeme hat) meint, es liegt
daran, dass der Interpreter den Scriptnamen nicht als Argument
entgegegennimmt, sondern aus der Umgebungsvariable SCRIPT_FILENAME
holt.
Und tatsächlich ist es so, dass wenn ich unter ssh diesen Wert setze
und danach den Interpreter aufrufe, er nicht mehr das beim Aufruf
übergebene Script verwendet, sondern immer das aus SCRIPT_FILENAME.
Ich brauche also eine Möglichkeit, entweder den Wert dieser
Umgebungsvariable frei zu setzen oder ihn zu löschen.
Aber wie kann ich eine Umgebungsvariable für ein per exec()
aufgerufenes Script setzen/löschen?
Mein Ansatz war, ein Batch zu schreiben, der die Variable setzt und
dann den Interpreter aufruft. Das hat aber so überhaupt nicht
funktioniert, dass ich nicht mal meinen Lösungansatz posten will (-;
Und am liebsten hätte ich auch noch eine Lösung, der ich beim Aufruf
des Batches noch einen Parameter übergeben kann. Das zweite Script
braucht nämlich eigentlich noch einen Parameter, der ihm mitteilt, was
es tun soll.
Also konkret hoffe ich auf folgende Lösung:
============= Script 1 ===========
$command = "mybatch $JOB_ID > erg.txt &";
exec( $command );
==================================
und
============= mybatch ============
Lösche SCRIPT_FILENAME
/usr/local/bin/php script2.php
Moin Bodo, Bodo Kaelberer schrieb am 17.11.2005 22:04:
Also konkret hoffe ich auf folgende Lösung:
============= Script 1 =========== $command = "mybatch $JOB_ID > erg.txt &"; exec( $command ); ==================================
und
============= mybatch ============ Lösche SCRIPT_FILENAME /usr/local/bin/php script2.php
================================== Sieht doch ganz einfach aus - ich schaff's aber nicht.
Ist auch ganz einfach: #!/bin/sh unset SCRIPT_FILENAME /usr/local/bin/php script2.php "$1" hth, Michael
Hallo1
Also konkret hoffe ich auf folgende Lösung:
============= Script 1 =========== $command = "mybatch $JOB_ID > erg.txt &"; exec( $command ); ==================================
und
============= mybatch ============ Lösche SCRIPT_FILENAME /usr/local/bin/php script2.php
================================== Sieht doch ganz einfach aus - ich schaff's aber nicht.
Ist auch ganz einfach: #!/bin/sh unset SCRIPT_FILENAME /usr/local/bin/php script2.php "$1"
Sieht gut aus. Aber irgendetwas klappt mit dem Aufruf noch nicht. Versuche ich die Batch-Datei direkt in der Shell aufzurufen, dann kommt ein Fehler: "bash: ./start_scanner.cmd: No such file or directory" Ich zitiere aus der Console. start_scanner.cmd ist die Batch-Datei (755 gesetzt) und test_called.php das 2. PHP-Script, also das von der Batch-Datei aufgerufene: ===================================================== u36237399:~/projekte/insiteme > ./start_scanner.cmd bash: ./start_scanner.cmd: No such file or directory u36237399:~/projekte/insiteme > cat ./start_scanner.cmd #!/bin/sh unset SCRIPT_FILENAME /usr/local/bin/php /kunden/homepages/6/d99991284/htdocs/projekte/insiteme/test_c alled.php "$1" > x.txt u36237399:~/projekte/insiteme > ls -l start_scanner.cmd -rwxr-xr-x 1 u3623739 ftpusers 138 Nov 17 23:53 start_scanner.cmd u36237399:~/projekte/insiteme > ls -l test_called.php -rw-r--r-- 1 u3623739 ftpusers 130 Nov 17 23:48 test_called.php u36237399:~/projekte/insiteme > pwd /kunden/homepages/6/d99991284/htdocs/projekte/insiteme u36237399:~/projekte/insiteme > whereis sh sh: /bin/sh /usr/share/man/man1/sh.1.gz u36237399:~/projekte/insiteme > whereis php php: /usr/local/bin/php /usr/local/bin/php4.old /usr/local/bin/php4.20030910 /us r/local/lib/php /usr/local/lib/php3.ini /usr/local/lib/php.ini ===================================================== Wo hängt es da noch? -- 1 Bodo Kaelberer 123 http://www.webkind.de/ http://www.kaelberer-aio.de/ 3 Dem Verständnis ist meist gut getan, wenn man richtig lesen 4 kann.
Moin, Bodo Kaelberer schrieb am 18.11.2005 00:02:
u36237399:~/projekte/insiteme > ./start_scanner.cmd bash: ./start_scanner.cmd: No such file or directory
u36237399:~/projekte/insiteme > cat ./start_scanner.cmd #!/bin/sh unset SCRIPT_FILENAME /usr/local/bin/php /kunden/homepages/6/d99991284/htdocs/projekte/insiteme/test_c alled.php "$1" > x.txt
Du stimmst mir hoffentlich zu, dass obiges nicht am Script liegen kann. Gegenbsp.: webserver:/tmp# ./start_scanner.cmd ./start_scanner.cmd: line 3: /usr/local/bin/php: No such file or directory webserver:/tmp# cat ./start_scanner.cmd #!/bin/sh unset SCRIPT_FILENAME /usr/local/bin/php /kunden/homepages/6/d99991284/htdocs/projekte/insiteme/test_called.php "$1" > x.txt webserver:/tmp# ls -l ./start_scanner.cmd -rwx------ 1 root root 135 Nov 18 15:04 ./start_scanner.cmd Ja, die obige Fehleremeldung ist vollkommen ok, da php bei mir an diesem Ort nicht zu finden ist. Michael
u36237399:~/projekte/insiteme > ./start_scanner.cmd bash: ./start_scanner.cmd: No such file or directory
u36237399:~/projekte/insiteme > cat ./start_scanner.cmd #!/bin/sh unset SCRIPT_FILENAME /usr/local/bin/php /kunden/homepages/6/d99991284/htdocs/projekte/insiteme/test_c alled.php "$1" > x.txt
Du stimmst mir hoffentlich zu, dass obiges nicht am Script liegen kann. Gegenbsp.:
... Ok, es würde vielleicht bei Dir laufen. Ich habe das doch auch nicht gepostet, weil ich mich über Deinen Vorschlag beschweren will. Da ist eine Fehlermeldung bash: ./start_scanner.cmd: No such file or directory die ich nicht verstehe, aber vielleicht jemand anderes? Welche Datei fehlt denn da? Wie an den zitieren ls zu sehen, sind alle aufgerufenen Dateien da, wo sie sein sollte. Bye -- 1 Bodo Kaelberer 123 http://www.webkind.de/ http://www.kaelberer-aio.de/ 3 Dem Verständnis ist meist gut getan, wenn man richtig lesen 4 kann.
Hallo, Am Fri, 18 Nov 2005, Bodo Kaelberer schrieb:
Sieht gut aus. Aber irgendetwas klappt mit dem Aufruf noch nicht.
Versuche ich die Batch-Datei direkt in der Shell aufzurufen, dann kommt ein Fehler: "bash: ./start_scanner.cmd: No such file or directory"
Ich zitiere aus der Console. start_scanner.cmd ist die Batch-Datei (755 gesetzt) und test_called.php das 2. PHP-Script, also das von der Batch-Datei aufgerufene:
===================================================== u36237399:~/projekte/insiteme > ./start_scanner.cmd bash: ./start_scanner.cmd: No such file or directory
u36237399:~/projekte/insiteme > cat ./start_scanner.cmd #!/bin/sh unset SCRIPT_FILENAME /usr/local/bin/php /kunden/homepages/6/d99991284/htdocs/projekte/insiteme/test_c alled.php "$1" > x.txt
Ueberpruefe, dass a) /bin/sh existiert und b) dein start_scanner.cmd im FTP-ASCII Mode uebertragen wurde und dass die Zeilenenden korrekt sind (nur LF, nicht CR-LF). Denn dann wird nach '/bin/sh\r' gesucht und die Datei gibt's nicht. -dnh -- 99: EDV Experimentelle Daten Verarbeitung (Andreas Frackowiak)
Hallo
Ueberpruefe, dass a) /bin/sh existiert und b) dein start_scanner.cmd im FTP-ASCII Mode uebertragen wurde und dass die Zeilenenden korrekt sind (nur LF, nicht CR-LF). Denn dann wird nach '/bin/sh\r' gesucht und die Datei gibt's nicht.
Das war's. An das Thema hatte ich gar nicht mehr gedacht. Aber wenn man sich neue Dateiendungen "erfindet", muss man das natürlich im FTP-Client anpassen. Vielen Dank. -- 1 Bodo Kaelberer 123 http://www.webkind.de/ http://www.kaelberer-aio.de/ 3 Dem Verständnis ist meist gut getan, wenn man richtig lesen 4 kann.
Hi Für's Archiv - vielleicht hat mal jemand ein ähnliches Problem. Entgegen meiner ersten Aussage lag es nicht an SCRIPT_FILENAME, sondern es wird der Wert von PATH_TRANSLATED verwendet. Und ein simples unset der Umgebungsvariable genügt auch nicht, sondern man muss PATH_TRANSLATED auf den Namen des Scriptes setzen, das man aufrufen will. Jetzt brauche ich nur noch eine Lösung für die Argumentübergabe an PHP. Diese werden nämlich gänzlich ignoriert. argc ist immer 0 und argv immer leer. Ich denke, ich erzeuge dafür einfach eine weitere Umgebungsvariable und teile dem Script den Wert darüber mit. Alles Gute und Dank an die, die geholfen haben. -- 1 Bodo Kaelberer 123 http://www.webkind.de/ http://www.kaelberer-aio.de/ 3 Dem Verständnis ist meist gut getan, wenn man richtig lesen 4 kann.
Hallo, Am Sun, 20 Nov 2005, Bodo Kaelberer schrieb:
Jetzt brauche ich nur noch eine Lösung für die Argumentübergabe an PHP. Diese werden nämlich gänzlich ignoriert. argc ist immer 0 und argv immer leer. Ich denke, ich erzeuge dafür einfach eine weitere Umgebungsvariable und teile dem Script den Wert darüber mit.
$ echo '<?php echo "$argv[1]\n"; ?>' > test.php $ php -f ./test.php foo foo Noch Fragen? -dnh -- "The day Microsoft makes something that doesn't suck is probably the day they start making vacuum cleaners." -- Ernst Jan Plugge
Hallo!
Jetzt brauche ich nur noch eine Lösung für die Argumentübergabe an PHP. Diese werden nämlich gänzlich ignoriert. argc ist immer 0 und argv immer leer. Ich denke, ich erzeuge dafür einfach eine weitere Umgebungsvariable und teile dem Script den Wert darüber mit.
$ echo '<?php echo "$argv[1]\n"; ?>' > test.php $ php -f ./test.php foo foo
Noch Fragen?
Wenn ich das recht verstehe, ist das der gängige Weg. Der funktioniert im vorliegenden Fall aber nicht, was wahrscheinlich daran liegt, dass der Mechanismus der Argumentauswertung übergangen wird, wenn PHP in der Apache-Umgebung aufgerufen wird. Vielleicht läst sich das auch über REQUEST_METHOD regeln. Oder eben den Wert ihn eine Umgebungsvariable - das wird schon klappen. Ich habe nun sogar noch eine Möglichkeit gefunden, es ganz ohne Batch zu machen: putenv( 'PATH_TRANSLATED=....' ); system( "/usr/local/bin/php > $fileOutput &" ); Ursprünglich hatte ich gedacht, putenv() würde nicht funktionieren. Aber da hatte ich es noch mit der falschem Umgebungsvariablen versucht: SCRIPT_PATHNAME. Bye -- 1 Bodo Kaelberer 123 http://www.webkind.de/ http://www.kaelberer-aio.de/ 3 Dem Verständnis ist meist gut getan, wenn man richtig lesen 4 kann.
participants (3)
-
Bodo Kaelberer
-
David Haller
-
Michael Wenger