PHP Taskkill über PHP

Penman

Lieutenant
🎅Rätsel-Elite ’25
Registriert
Feb. 2009
Beiträge
922
Hallo,

wiedermal habe ich ein Problem. Dieses Mal geht es um den Shell Befehl Taskkill. Ich würde diesen gerne nutzen. Jedoch nicht über die PowerShell oder normale Shell (OS: Win Server 2k8 R2 mit xampp).

Ich habe ein pid-File in dem logischerweise eine pid steht. Diese möchte ich auf Knopfdruck beenden. Leider scheint weder exec noch system noch shell_exec irgendwas zu machen.

Hat wer Rat oder gar ein komplettes Beispielscript?
 
'Scheint nichts zu machen' klingt als wenn es nach dem ersten Anlauf nicht funktioniert hat, du die Lust verloren hast und jetzt einfach mal im Forum nachfragst ohne irgendwelche Informationen zu präsentieren. Ist das so?

Diese (sehr trivialen) Funktionen sind im PHP Handbuch sehr gut dokumentiert, ich würde dir raten, da mal nach zu lesen.

Wenn du allerdings direkte Hilfe von uns willst, dann musst du schon etwas mehr Informationen liefern, wie z.B:

- Apache/PHP Versionen.
- Alle Pfade (inklusive XAMPP, htdocs, in dem Skriptpfad)
- Logfiles (access und error log)
- Unter welchem Username läuft Apache/PHP?
- Unter welchem Username läuft der Prozess?
- Kannst du den Prozess ohne Probleme killen wenn du den Befehl in der Eingabeaufforderung absetzt?
 
Oh glaub mir. 2 Stunden rumfummeln, einen Servercrash und langes Googlen sprechen für sich.
Die Fragen will ich doch sofort beantworten:

Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1

xampp liegt in c:\xampp
htdocs liegt in c:\xampp\htdocs
der Scriptpfad ist inzwischen aus Verzweifelung schon in
c:\xampp\htdocs gewandert

Apache läuft unter dem Anmeldenamen System, da es als Dienst läuft
Der Prozess lief sowohl gestartet von Apache selbst (wenn auch etwas fehlerhaft) also System und von einem Benutzer namens root2

Und jetzt wo ich den Errorlogsehe wird mir recht schwarz. Der ist gute 900 MB groß und kaum noch mit einem Editor zu öffnen.
Ich glaube, ich werde den wohl erstmal bereinigen müssen, bevor ich damit arbeiten kann.
 
Ok, dann warten wir mal auf den Errorlog.

Du kannst auch den Errorlog löschen, Apache neu-starten und die den Fehler triggern, dann sollte der Log sauber genug sein.
 
Im errorlog steht nichts dazu. Ich hab das ganze Dingen jetzt gelöscht und die Seite aufgerufen. Es werden keine Einträge gemacht.
 
Ausgaben bekomme ich mit exec nicht. system sagt nichts (denke mal das heißt Erfolg)
Über CMD funktioniert das aber einwandfrei.
 
Ich würde shell_exec benutzen, und Fehler in ein Textfile schreiben, z.B:

PHP:
$out = shell_exec("taskkill 2>errors.txt");

Dann die Datei errors.txt überprüfen.
 
Die errors.txt wird erstellt, bleibt aber leer.
Code:
taskkill /PID 7172 >errors.txt
Exakt dieser Befehl wird jetzt über shell_exec ausgeführt.
 
Tut sich nichts
Code:
NULL
taskkill /PID 10992 >errors.txt
bei einem gekritzelten Code
Code:
$bla = "taskkill /PID {$pid} >errors.txt";
$ausgabe = shell_exec($bla);
var_dump($ausgabe);
echo "<br>".$bla."<pre>";
 
Dir fehlt aber die wichtige '2' vor dem > (das war nicht die PID, sondern weist die CLI an, Fehler in dieses File zu schreiben)!

Also

Code:
taskkill /PID 10992 2>errors.txt

ohne Leerzeichen zwischen 2 und >!
 
Ahhh das schaut doch gleich viel besser aus.
Den Fehler konnte ich jetzt selbst lösen.
Das Problem war, dass der Prozess ein normales Beenden nicht kennt und deswegen dazu gezwungen werden muss. Sprich /F.

Vielen Dank!
Vielleicht weiß du ja auf die Frage, wie ich eine exe Datei über PHP starten kann und diese dann, wenn sie abstürzt, automatisch neu startet.
Im Moment realisiere ich das über eine bat Datei, die ich auf dem Server manuell starte.
Code:
:go
binary.exe
goto go
Ganz primitiv.
Sollte man das auch über shell_exec machen oder eher über exec?
 
Über PHP würde ich das auf keinen Fall laufen lassen, schon gar nicht bei einem über Apache gespawnten PHP Prozess.


Ich würde die Andwendung in einen Service umwandeln, und die in Windows integrierte 'Wiederherstellung' nutzen.
 
Zurück
Oben