• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

shell_exec lässt Apache abstürtzen

Puccini

Neues Mitglied
Hi! Ich nutze den Befehl "shell_exec" wie folgt:

Code:
$cmd=shell_exec("ping -n 1 -w 3 $IP");

leider kommt es bei manchen IP's zu einem Serverausfall und ich weis einfach nicht warum..
Ich lass schon überprüfen ob die IP vollständig ist und ob auch keine Buchstaben enthalten sind.
Aber tortzdem passiert es das bei einigen IP's sich mein Apache aufhängt und ich ihn erst neustarten muss bis es wieder geht :<

kennt jemand das phänomen und weis woran es liegt??
ich danke schonmal für die hilfe :D

Ach und nochwas:
ich werte zur Zeit die Anzahl der Empfangen Packete aus, aber wenn bei dem Ping kommt "Antwort von xx.xx.xx.xx: Zielhost nicht erreichbar." zählt das auch als Empfangen..
wie kann ich sicher stellen das auch wirklich nur erfolgreiche Pings erkannt werden? :<

viele dank

hier noch die PHP-Funktion:
Code:
function sendPing($IP)
{
    //Überprüfen ob es sich um eine gültige IP-Adresse handelt
    //nur Zahlen und "." sind erlaubt
    $ValidateData = array('1','2','3','4','5','6','7','8','9','0','.');
    for($i=0;$i<strlen($IP);$i++)
    {
        if(in_array($IP[$i],$ValidateData)==false)
            return utf8_encode("ungültige IP: ".$IP);
    }
    if($IP=="0.0.0.0")
        return utf8_encode("ungültige IP: ".$IP);
    //Ping via Shell ausführen
    //exec alleine reicht nicht
    //1 Packet wird gesendet, Client muss innerhalb 3ms antworten
    $cmd=shell_exec("ping -n 1 -w 3 $IP"); 
    //Ermitteln der empfangenen Packete
    $empfang = stristr($cmd,"Empfangen =");
    $anz = trim(substr($empfang,11,2));
    if($anz!="0")      
    {
        return "online";
    }           
    return "offline";
}
 
Ping doch direkt mit PHP
PHP:
<html>
<body>
<?php
if ((isset($_POST['startping'])) && (!empty($_POST['host'])) && (!empty($_POST['port'])) && (!empty($_POST['numpings'])))
    {
        $host=$_POST['host'];
        $port=$_POST['port'];
        $numpings=$_POST['numpings'];
        for ($x=0;$x<$numpings;$x++)
            {
                $starttime=microtime();
                $socket=@fsockopen($host,$port);
                $endtime=microtime();
                if ($socket!=false)
                    {
                        fclose($socket);
                        list($msec,$sec)=explode(" ",$starttime);
                        $starttime=(float)$msec+(float)$sec;
                        list($msec,$sec)=explode(" ",$endtime);
                        $endtime=(float)$msec+(float)$sec;
                        $pingtime=($endtime-$starttime)*1000;
                    }
                else
                    {
                        $pingtime=-1;
                    }
                if ($pingtime!=-1)
                    {
                        echo $host.' ('.$port.'): '.round($pingtime,2).' ms';
                    }
                else
                    {
                        echo 'Port '.$port.' could not be reached on '.$host.'';
                    }
                flush();
            }
    }
?>

<form method="post" action="ping.php">
Host:<input type="text" name="host" value="localhost">
Port:<input type="text" name="port" value="80">
Pings:<input type="text" name="numpings" value="4">
<input type="submit" name="startping" value="Ping">
</form>
</body>
</html>
 
irgendwie stürtz trotzdem noch der server ab -.-
ich weis echt nich woran es liegen soll!
wenn ich die ip normal im cmd eingebe geht auch alles :<

ich bin echt am verzweifeln.
 
Ps:
PHP:
if(preg_match("/[1-9][0-9]{0,2}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/", $ip)) {
    // hier ping ausführen ohne weitere überprüfung was in $ip steht ^^
}
 
Zuletzt bearbeitet von einem Moderator:
seh ich das richtig in der preg_match:
da weden doch nur zahlen von 0-99 erlaubt oder?
soll aber von 0-255

:?:
 
nein da werden zahlen von 1 bis 255 hugelassen... muss ich abe rnochmal ändern... *gg* sind ja

1-255.0-255.0-255.0-255
 
ich hab den fehler gefunden!

Ich hab via js die einzelnen IP's an mein php geschickt, und dann dort den ping gesettz.
das hat leider manchmal zu fehlern geführt!
wenn ich jedoch die ganzen IP's mit einmal übergebe und erst im PHP zerlege(mit ";" getrennt), dann klappts perfekt!
Weis nicht warum das mit JS einen fehler verursacht hat?
kann es zu einem Variabelenkonfikt kommen wenn ich zu schnell hintereinander die selbe funktion aufrufen lasse?

js
Code:
for(i=0;i<IPs.lengths;i++)
{
                               //###############################    Ping senden
                                        postData = "Ping=true&IP="+IPs[i];
                                        requestNeueDaten = YAHOO.util.Connect.asyncRequest('POST', sUrl, callbackPing, postData);                    
                                        postData = "";  
}

so wurden die einzelnen ips vom js an php gesendet...
ich glaub da lag der fehler!
jetzt werden alle ips mit einmal gesendet und dann erst ausgewertet :D
 
.....
kann es zu einem Variabelenkonfikt kommen wenn ich zu schnell hintereinander die selbe funktion aufrufen lasse?
....
eigentlich nicht, da deine funktion immer wieder einen neuen var-bereich definiert. solltest du den maximalen memory, max_execution_time oder sonst was überschreiten oder variablen überschneidungen haben, sollte mit einer fehlermeldung quittiert werden.

genau genommen ist dein fehler also noch da, der apache dürfte NICHT absaufen. ich würde dem weiter nachgehen (schlagwort top)

by the way...
könnte es sein, das dein apache nicht wegknickt sondern busy ist und deshalb nichts zurück meldet. fehlende rückmeldungen werden ja öfter mal als absturz definiert. lass die alte version doch einfach mal laufen, und wenn es 2 stunden ist.
 
sorry fürs pushen, aber für mich is es aktuell ;)

ich hab nach langen problemlosen
Code:
shell_exec("ping blblbla");
wieder probleme damit bekommen, da sich einige ressourcen nicht am netz befanden bzw nicht über dhcp aufgelöst werden konnten.
Also hab ich nochmal was versucht.
Code:
$socket = @fsockopen($Hostname,80,$erroNo,$errMsg,1);
            if($socket)      
            {
                fclose($socket);
                return "online";
            }
So geht es jetzt :D
Dabei musste ich leider einen andern Port als 80 nehmen, da der nicht offen ist.

aber so scheint es zu gehen! mir is dabei egal wie lang der ping dauert, daher entfällt die auswertung.
Danke für eure hilfe! wäre sonst nicht auf die idee mit den socket gekommen.
 
Zuletzt bearbeitet:
Nur damit Du nicht dumm stirbst, eigentlich heißt das Ding "Socket".
(Wobei der Variablenname selbstverständlich egal ist)
 
Zurück
Oben