exec() system() System-Crash, need help

Bash, Shell, PHP, Python, Perl, CGI
->x3<-
Posts: 18
Joined: 2004-01-11 19:27

exec() system() System-Crash, need help

Post by ->x3<- »

hallo,

welche möglichen gründe könnte es geben warum exec() system() zu einem üblen crash führen?
ich möchte über exec() eine andere php-datei starten.
der befehl:
/usr/local/bin/php4 /kunden/homepages/xx/dxxxxxxxx/htdocs/script.php

hierbei handelt es sich um einen 1&1 managed-server.
safe_mode=off

wenn ich die befehlzeile über einen crontab ausführen lasse, klappt alles.
nur bei exec() system() etc... krachts im gebälk.

würd mich freuen wenn da jemand weiterhelfen könnte :)
darkspirit
Posts: 553
Joined: 2002-10-05 16:39
Location: D'dorf

Re: exec() system() System-Crash, need help

Post by darkspirit »

Definiere "Crash". Was passiert genau?
->x3<-
Posts: 18
Joined: 2004-01-11 19:27

Re: exec() system() System-Crash, need help

Post by ->x3<- »

... hmmm ....
wenn ich das initiierende script, also mit der exec(), bleibt der bildschirm weiß, für lange zeit, bis die 500'er meldung kommt.

mit viel zeit und glück komme ich über ssh an den server, und ps -x zeigt mir 100 - 200 aktive script.php.
wenn ich die pid der unzähligen script.php-prozesse ansehe, muß es sich um eine schleife handeln, den die pid's ändern sich fortlaufend.
so nach einer dreiviertelstunde hat sich der server wieder 'eingekriegt', d.h. der fehler ist weg.
allerdings ist kein ergebnis von der script.php zu sehen.
die script.php funktioniert jedoch, wenn ich sie direkt über meinen browser aufrufe.
oxygen
Posts: 2138
Joined: 2002-12-15 00:10
Location: Bergheim

Re: exec() system() System-Crash, need help

Post by oxygen »

->X³<- wrote: die script.php funktioniert jedoch, wenn ich sie direkt über meinen browser aufrufe.
Vielleicht solltest du das dann auch tun.
->x3<-
Posts: 18
Joined: 2004-01-11 19:27

Re: exec() system() System-Crash, need help

Post by ->x3<- »

Nein,
script.php soll von einer anderen php-datei mit exec() gestartet werden...
darkspirit
Posts: 553
Joined: 2002-10-05 16:39
Location: D'dorf

Re: exec() system() System-Crash, need help

Post by darkspirit »

Erklär doch mal, warum du das brauchst.. vielleicht können wir dir einen besseren Weg vorschlagen ;)
->x3<-
Posts: 18
Joined: 2004-01-11 19:27

Re: exec() system() System-Crash, need help

Post by ->x3<- »

das geht jetzt am thema vorbei ...
arty
Userprojekt
Userprojekt
Posts: 729
Joined: 2002-06-12 10:11

Re: exec() system() System-Crash, need help

Post by arty »

->X³<- wrote:das geht jetzt am thema vorbei ...
Tolle Antwort auf ein Hilfeangebot eines Users.

bye
arty
theomega
Userprojekt
Userprojekt
Posts: 696
Joined: 2003-01-27 14:36

Re: exec() system() System-Crash, need help

Post by theomega »

produzierst du evtl eine Endlosschleife? rufst du das Script selbst wieder auf?
niklas_
Posts: 122
Joined: 2003-08-13 20:46

Re: exec() system() System-Crash, need help

Post by niklas_ »

theomega wrote:produzierst du evtl eine Endlosschleife? rufst du das Script selbst wieder auf?
das wird der fall sein :) zeig uns doch den quellcode mal (der datei, die die datei aufruft)
->x3<-
Posts: 18
Joined: 2004-01-11 19:27

Re: exec() system() System-Crash, need help

Post by ->x3<- »

nein, eben nicht.
sobald exec() bearbeitet wird, hängt die sache.


@arty:
nicht falsch verstehen, doch mein hilferuf geht um exec(), nicht welche anderen wege es gibt. oder warum und wieso ich das brauche...
korregier mich wenn ich es falsch sehe.
oxygen
Posts: 2138
Joined: 2002-12-15 00:10
Location: Bergheim

Re: exec() system() System-Crash, need help

Post by oxygen »

->X³<- wrote:Nein,
script.php soll von einer anderen php-datei mit exec() gestartet werden...
Warum, wenns über http geht, dann ruf das Script doch per Curl oß auf.
->x3<-
Posts: 18
Joined: 2004-01-11 19:27

Re: exec() system() System-Crash, need help

Post by ->x3<- »

über exec() soll das andere script unabhängig gestartet werden.
Mir würde es schon helfen, wenn jemand mal einen beipielbefehl für die exec() anhand der daten zu beginn des thread.... ;)
majortermi
Userprojekt
Userprojekt
Posts: 916
Joined: 2002-06-17 16:09

Re: exec() system() System-Crash, need help

Post by majortermi »

->X³<- wrote:über exec() soll das andere script unabhängig gestartet werden
Meinst du damit, dass dein aufrufendes Skript nach dem exec()-Befehl weitermacht, bevor der auszuführende Befehl beendet ist?

Dazu müsstest du sinnvollerweise erst ein fork() und dann eine exec() machen (und den Prozess dämonisieren), das geht mit PHP aber meines Wisssens nicht - ich würde dir daher empfehlen einfach einen kleinen Wrapper in C zu schreiben.
Erst nachlesen, dann nachdenken, dann nachfragen... :)
Warum man sich an diese Reihenfolge halten sollte...
->x3<-
Posts: 18
Joined: 2004-01-11 19:27

Re: exec() system() System-Crash, need help

Post by ->x3<- »

exec() führt ein gegebenen Befehl aus, ohne eine Ausgabe zu erzeugen. Die Funktion gibt lediglich die letzte Zeile aus dem Befehlsergebnis zurück. Wenn Sie auf die direkte Rückgabe/ Ausgabe eines Befehls angewiesen sind, dann benutzen Sie stattdessen ....

for($x=0;$x<5;$x++)
{
exec(#Hier soll $x.php gestartet werden und die Schleife egal was passiert weiterlaufen#);
}

$x.php ruft über url eine externe datei auf.

--> dauerts mal extrem lange in $x.php oder sonstirgendwas stört, soll die schleife davon unberührt bleiben und fortgeführt werden.

Was ist eigentlich unter:
Die Funktion gibt lediglich die letzte Zeile aus dem Befehlsergebnis zurück
zu verstehen?
fettehenne
Posts: 62
Joined: 2003-05-08 15:20
Location: Hannover

Re: exec() system() System-Crash, need help

Post by fettehenne »

Meines Wissens nach kehrt ein erfolgreicher exec()-Aufruf niemals zurück da sich ja der eigene Prozess mit dem neuen überlagert. Und dadurch hast du ja schon deinen Unendlich-Mechanismus in deiner Schleife.

Oder? :?:
kase
Posts: 1031
Joined: 2002-10-14 22:56

Re: exec() system() System-Crash, need help

Post by kase »

MajorTermi wrote:Dazu müsstest du sinnvollerweise erst ein fork() und dann eine exec() machen (und den Prozess dämonisieren), das geht mit PHP aber meines Wisssens nicht
PHP hat ein eigenes Process-Handling, sehr ähnlich dem von Linux. Man kann sich ganz einfach einen Child mit $childpid = pcntl_fork(); im parent machen. Allerdings benötigt exec() keinen eigenen Prozess. exec() macht automatisch einen neuen Process als Unterprozess von dem PHP Thread auf (dies ist aber KEIN Child !!!)

Und natürlich wird nach Abarbeitung von exec() wieder ins Main-Script zurückgegangen, exec() gibt die Ausgabe des anderen Prozesses als String zurück. Alternativen zu exec() gibt es eigentlich keine, höchstens noch system(), was aber sehr sehr ähnlich ist.
->x3<-
Posts: 18
Joined: 2004-01-11 19:27

Re: exec() system() System-Crash, need help

Post by ->x3<- »

Beachten Sie auch, dass wenn Sie ein Programm mit dieser Funktion starten und Sie es im Hintergrund laufen lassen möchten, Sie sicherstellen müssen, dass die Ausgabe des Programms in eine Datei oder anderenen Ausgabestream umgeleitet wird. Andernfalls wird PHP solange laufen, bis das Programm beendet ist.
Nochmal:
In order to execute a command have have it not hang your php script while it runs, the program you run must not output back to php. To do this, redirect both stdout and stderr to /dev/null, then background it.

> /dev/null 2>&1 &

In order to execute a command and have it spawned off as another process that is not dependent on the apache thread to keep running (will not die if somebody cancels the page) run this:

exec('bash -c "exec nohup setsid your_command > /dev/null 2>&1 &"');
So,
die folgende Datei rufe ich im Browser auf.

Code: Select all

<?php
echo exec("/usr/local/bin/php4 /kunden/homepages/xx/dxxxxxxxx/htdocs/fp.php > /dev/null 2>&1");
$handle=@fopen(time()."_exec.txt","w");
fclose($handle);
echo "done ;)";
?>
Und die fp.php ist:

Code: Select all

<?php
flush();
sleep(5);
$handle=@fopen(time()."_fp.txt","w");
fclose($handle);
?>
Was soll passieren?
Bei Aufruf des ersten Scripts soll die fp.php unabhängig gestartet werden.
Es werden in beiden Datein zur Kontrolle timestamp-Dateien erstellt.
Wenn es glatt laufen würde, müßten die stamps ca. 5 Sek. auseinander liegen.

Was passiert?
Das erste Script schreibt 15 bis 20 mal (im Sekundentakt) seine stamp-Datei und das war's.

Mit > /dev/null 2>&1 wird doch der Prozess so gelagert, das das erste Script weiterläuft, ohne zu warten.
Warum funktioniert das nicht so? Steht's doch überall so geschrieben?


PS:
Dies sind nur Test-Scripte ;)
->x3<-
Posts: 18
Joined: 2004-01-11 19:27

Re: exec() system() System-Crash, need help

Post by ->x3<- »

Hmm ...
mit
exec("/usr/local/bin/php4 /kunden/homepages/xx/dxxxxxxxx/htdocs/fp.php > /dev/null 2>&1 &",$stdout, $stderr);
bin ich schonmal soweit, das das Browserfenster sofort "done ;)" schreibt.
D.h. das erste Script wird so wie es soll ohne Warten abgearbeitet.
Ein Fortschritt.
Nun ist es aber so, das jetzt fortlaufend pausenlos "stamp"_exec.txt Dateien geschrieben werden. Also jene die von ersten Script nur einmal geschrieben werden soll.
Von fp.php weit und breit nichts zu sehen...

Es ist mir ein Rätsel ... :(
kase
Posts: 1031
Joined: 2002-10-14 22:56

Re: exec() system() System-Crash, need help

Post by kase »

Ich vermute, es ist irgendein Rechte-Problem...

datei.php

Code: Select all

<?php 
exec("/usr/local/bin/php4 /kunden/homepages/xx/dxxxxxxxx/htdocs/fp.php",$fpout);
print_r($fpout);
$handle=@fopen(time()."_exec.txt","w"); 
fclose($handle); 
echo "done ;)"; 
?> 
fp.php

EDIT: Ich hasse dieses Board :(

http://www.legendz.de/testperms.php

Das highlight_file(); exit; einfach rausnehmen vorher !

Edit2: Das ganze dann betrachten mit "Quelltext anzeigen"

Bitte sämtliche Ausgabe posten, und bitte keinesfalls irgendwas X`en, da wirklich alle Angaben wichtig sind !
->x3<-
Posts: 18
Joined: 2004-01-11 19:27

Re: exec() system() System-Crash, need help

Post by ->x3<- »

das vom ersten script geht nicht zu posten *lol*

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 1193164 bytes) in /var/webroot/rf/forum/includes/functions_post.php on line 103


werd das mal zippen
kase
Posts: 1031
Joined: 2002-10-14 22:56

Re: exec() system() System-Crash, need help

Post by kase »

Woeher nimmst du das Fatal Error ?

zB diese function_post.php sollte doch eigentlich nirgends auftauchen. Die Ausgabe des ersten Scripts, also das print_r($fpout) sollte ca 10 Zeilen groß sein !
->x3<-
Posts: 18
Joined: 2004-01-11 19:27

Re: exec() system() System-Crash, need help

Post by ->x3<- »

Das Fatal Error ist von diesem Forum ;)
http://217.160.135.179/exec.zip
kase
Posts: 1031
Joined: 2002-10-14 22:56

Re: exec() system() System-Crash, need help

Post by kase »

So wie das für mich aussieht, rufst du die gleiche Datei im Browser auf, die du auch mit exec() ausführen tust, warum auch immer.

Ich erkenne das daran, weil 1. die fp.php nicht die Ausgabe hat, die sie haben sollte, sondern fp.php hat die gleiche Ausgabe wie eigentlich datei.php haben müsste. Dh, entweder sind fp.php und datei.php identisch, oder du rufst von datei.php aus irgendeinem Grund nicht fp.php sondern nochmal datei.php auf. 2. würde das auch erklären, warum er in eine Endlos-Schleife "fällt", denn du hast die Ausgabe von datei.php ca 1000 mal, vermutlich bis zum Script-timeout. 3. erklärt das auch deine sekündlich angelegten stamp_files.
->x3<-
Posts: 18
Joined: 2004-01-11 19:27

Re: exec() system() System-Crash, need help

Post by ->x3<- »

Nein,
im Browser rufe ich "datei.php" auf.
Die Datei hat exakt den von Dir geposteten Inhalt.
Quelltexte beider Dateien sind doch hier einzusehen.

Mich würde auch der Grund interessieren warum
das Script bei
$handle=@fopen(time()."_exec.txt","w");
sich aufhängt.
Ich habe schon duzende im www findbare Variantionen an UNIX/Shell-Befehlen für exec() ausprobiert.
Bei manchen wurde das exec.txt-File auch nur einmal geschreiben, so wie es sein soll. Doch das file der fp.php bleibt nach wie vor aus.

Ã?brigends ist die fp.php chmod 755 und je nach exec() mit #! /usr/local/bin/php4
beginnend.