batch Datei um Apache zu restarten
DarkSoja
- php
Hallo!
Ich bin in zwischen am verzweifeln. Ich habe mir für meinen localhost, also meine Entwicklungsumgebung, eine "Startseite" geschrieben, auf der auch verschiedene Optionen für Apache und MySQL angezeigt werden.
Unter anderem möchte ich eine Restartfunktion für Apache haben.
Ich habe also einen Link zur Apacherestatt.php eingefügt, welche so aussieht:
<html>
<head>
<link rel="stylesheet" class="text/css" href="special.css">
<link rel="stylesheet" class="text/css" href="tables.css">
<title>Apache restart</title>
</head>
<body>
<?php
include("design.inc.php");
popen("start /B prog.exe", 'r');
echo message("Bitte warten Sie einen Moment!","green");
?>
<br />
<a href="../">Zurück</a>
</body>
</html>
Die Datei "prog.exe" ruft nur eine .bat Datei auf, die ich aber irgendwie nicht direkt öffnen konnte (wegen absoluter Pfade...).
Diese batchdatei sieht so aus (Sorry für Pearl):
@ECHO OFF & SETLOCAL
PUSHD %~dp0
ECHO Now we restart Apache
xampp_cli.exe restart apache
POPD
PAUSE
Wenn ich diese Datei über den Explorer aufrufe oder die prog.exe manuell starte wird apache auch neugestartet. Doch über das PHP-SCript nicht. Es wird zwar die Meldung in der Bat Dateiausgegeben, dass Apache neugestartet wurde, doch ist der Apache-Dienst im TaskManager hinterher "Beendet" und lässt sich per Rechtsklick->Starten nicht starten. Führe ich die apache_start.bat oder die apache_restart.bat aus, klappt es wieder.
Woran kann das liegen?
Ich habe das Ganze auch schon mit exec probiert - Gleiches Problem...
Viele Grüße!
Hello,
Die Datei "prog.exe" ruft nur eine .bat Datei auf, die ich aber irgendwie nicht direkt öffnen konnte (wegen absoluter Pfade...).
Wenn ich diese Datei über den Explorer aufrufe oder die prog.exe manuell starte wird apache auch neugestartet. Doch über das PHP-SCript nicht. Es wird zwar die Meldung in der Bat Dateiausgegeben, dass Apache neugestartet wurde, doch ist der Apache-Dienst im TaskManager hinterher "Beendet" und lässt sich per Rechtsklick->Starten nicht starten. Führe ich die apache_start.bat oder die apache_restart.bat aus, klappt es wieder.
Woran kann das liegen?
Meine Theorie:
Innerhalb der zweiten Shell (die durch prog.exe produziert wird) wird eine weitere Instanz des Apachen gestartet. die in dieselbe Run-Datei schreibt? Wenn die Shell endet, wird vermutlich auch der Apache-Dienst beendet. Die Run-Datei ist jetzt aber auf den zweiten (jetzt nicht mehr laufenden) Apachen umgeschrieben. Der alte Apache ist daher auf diesem Wege nicht mehr erreichbar.
Du benötigst das Objekthandle (bei Linux PID) des Dienstes, den Du beenden willst. Woher Du das unter Windows bekommst, weiß ich nicht. Außerdem hat der Apache i.d.R. einen Parentprocess und viele Childs. Wenn Du nicht den Parent stoppst, nützt Dir das gar nichts.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
Die Datei "prog.exe" ruft nur eine .bat Datei auf, die ich aber irgendwie nicht direkt öffnen konnte (wegen absoluter Pfade...).
Wenn ich diese Datei über den Explorer aufrufe oder die prog.exe manuell starte wird apache auch neugestartet. Doch über das PHP-SCript nicht. Es wird zwar die Meldung in der Bat Dateiausgegeben, dass Apache neugestartet wurde, doch ist der Apache-Dienst im TaskManager hinterher "Beendet" und lässt sich per Rechtsklick->Starten nicht starten. Führe ich die apache_start.bat oder die apache_restart.bat aus, klappt es wieder.
Woran kann das liegen?
Meine Theorie:
Innerhalb der zweiten Shell (die durch prog.exe produziert wird) wird eine weitere Instanz des Apachen gestartet. die in dieselbe Run-Datei schreibt? Wenn die Shell endet, wird vermutlich auch der Apache-Dienst beendet. Die Run-Datei ist jetzt aber auf den zweiten (jetzt nicht mehr laufenden) Apachen umgeschrieben. Der alte Apache ist daher auf diesem Wege nicht mehr erreichbar.Du benötigst das Objekthandle (bei Linux PID) des Dienstes, den Du beenden willst. Woher Du das unter Windows bekommst, weiß ich nicht. Außerdem hat der Apache i.d.R. einen Parentprocess und viele Childs. Wenn Du nicht den Parent stoppst, nützt Dir das gar nichts.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Danke für die Antwort.
Ich nutze das XAMPP Paket, da waren halt mehrere batch-Dateien drin.
einmal die Apache_stop.bat und die Apache_start.bat
Diese rufen nur die xampp_cli.exe mit den Befehlen stop apache bzw. start apache auf.
Ein weiterer Befehl ist restart apache. Ich versteh nicht so ganz, warum das Ganze klappt, wenn ich die Datei manuell starte...
Wartet das PHP-Script auf die Rückgabe der prog.exe, welches wiederrum durch auf die Rückgabe der apache_restart.bat wartet?
Da während der Laufzeit apache dann "weg" wäre, ist es verständlich, dass dadurch auch die prog.exe bzw. die apache_restart.bat von apache selbst vorher abgeschossen wird, oder nicht?!?
Hinterher ist apache halt nur beendet, was bedeutet, dass das Script nur "halb" läuft...
Kann man die prog.exe nicht irgendwie starten, ohne dass das php-script auf eine Rückgabe wartet??
Viele Grüße und Hoffnung auf eine Lösung ;)
Hello,
Wenn ich diese Datei über den Explorer aufrufe oder die prog.exe manuell starte wird apache auch neugestartet. Doch über das PHP-SCript nicht. Es wird zwar die Meldung in der Bat Dateiausgegeben, dass Apache neugestartet wurde, doch ist der Apache-Dienst im TaskManager hinterher "Beendet" und lässt sich per Rechtsklick->Starten nicht starten. Führe ich die apache_start.bat oder die apache_restart.bat aus, klappt es wieder.
Es ist außerdem ein Unterschied, ob man eine *.bat aus einer anderen *.bat heraus einfach durch Nennung ihres Namens aufruft, oder durch 'call *.bat'.
Im ersteren Fall bricht die aufrufende *.bat beim aufruf der nächsten ab. Die nächste läuft weiter. Bei einem CALL wird die aufgerufene *.bat wie ein Unterprogramm behandelt.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
Wenn ich diese Datei über den Explorer aufrufe oder die prog.exe manuell starte wird apache auch neugestartet. Doch über das PHP-SCript nicht. Es wird zwar die Meldung in der Bat Dateiausgegeben, dass Apache neugestartet wurde, doch ist der Apache-Dienst im TaskManager hinterher "Beendet" und lässt sich per Rechtsklick->Starten nicht starten. Führe ich die apache_start.bat oder die apache_restart.bat aus, klappt es wieder.
Es ist außerdem ein Unterschied, ob man eine *.bat aus einer anderen *.bat heraus einfach durch Nennung ihres Namens aufruft, oder durch 'call *.bat'.
Im ersteren Fall bricht die aufrufende *.bat beim aufruf der nächsten ab. Die nächste läuft weiter. Bei einem CALL wird die aufgerufene *.bat wie ein Unterprogramm behandelt.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Ich rufe ja keine andere bat auf... ich verstehe nur nicht, warum das per php nicht klappt, aber ansonsten schon.
MySQL-Start und Stop klappt wunderbar... Das rufe ich genau so auf.