AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Prozess sanft beenden (ohne Fenster)
Thema durchsuchen
Ansicht
Themen-Optionen

Prozess sanft beenden (ohne Fenster)

Ein Thema von Alien426 · begonnen am 29. Aug 2010 · letzter Beitrag vom 31. Aug 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Alien426
Alien426

Registriert seit: 21. Dez 2005
146 Beiträge
 
Turbo Delphi für Win32
 
#1

Prozess sanft beenden (ohne Fenster)

  Alt 29. Aug 2010, 18:15
Bevor ich zum Thema komme, kurz eine Rechtfertigung. Ich weiss, dass es dieses Thema schon in der einen oder anderen Form gibt. Ich denke, dass es trotzdem seine Daseinsberechtigung hat.

Kurze Einführung:
Ich habe den Apache Webserver auf einem USB-Stick. Bisher startete ich ihn per Batch-Skript (start "Apache" http.exe -w) und konnte dann im Konsolen-Fenster einfach [Strg]+[C] drücken und er wurde beendet.

Jetzt schreibe ich ein kleines Programm in Delphi, das am Ende als Icon in der TNA sitzen und per Kontextmenü den Apache starten und beenden soll.

Zur Zeit führe ich Apache mit ShellExecuteEx() aus, was mir den Prozess-Handle liefert. Den kann ich dann in TerminateProcess() benutzen, um zu beenden. Das gefällt mir aber nicht sehr, da
1. der Apache einen Kindprozess startet, der damit nicht beendet wird
2. der Apache nicht sauber beendet wird (Error-Log: "Unclean shutdown of previous Apache run?")

Den ersten Punkt könnte man wohl erledigen, indem man die laufenden Prozesse nach der Exe durchsucht und auch diese abschießt.

Lieber wäre mir aber eine Lösung, die einfacher und zuverlässiger ist und auch den zweiten Punkt erledigt. Zum Beispiel WM_CLOSE zu senden. Aber das geht ja nicht ohne Fenster.

Apache-seitig kann ich nur was ausrichten, wenn er als Dienst installiert ist (httpd.exe -k stop), was ich aber nicht machen möchte, da er ja auf einem Stick laufen und auf dem "Gastsystem" nicht ungezogen sein soll.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.993 Beiträge
 
Delphi 12 Athens
 
#2

AW: Prozess sanft beenden (ohne Fenster)

  Alt 29. Aug 2010, 18:26
Kann man den Apache nicht auch via Batch beenden?

Du kannst ja mal im WAMP schauen, wie die das machen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Prozess sanft beenden (ohne Fenster)

  Alt 29. Aug 2010, 19:07
Auf http://httpd.apache.org/docs/2.2/platform/windows.html ist es dokumentiert:

Zitat:
To run Apache from the command line as a console application, use the following command:

httpd.exe

You can tell a running Apache to stop by opening another console window and entering:

httpd.exe -k shutdown
Viele Grüße,
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

AW: Prozess sanft beenden (ohne Fenster)

  Alt 29. Aug 2010, 20:24
Für Programme die so etwas nicht unterstützen kann man mit PostThreadMessage die entsprechende Quit-Message in die Messagequeue des Threads absetzen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Alien426
Alien426

Registriert seit: 21. Dez 2005
146 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: Prozess sanft beenden (ohne Fenster)

  Alt 29. Aug 2010, 20:49
Kann man den Apache nicht auch via Batch beenden?

Du kannst ja mal im WAMP schauen, wie die das machen.
Meinst du XAMPP?

Den Source zur XAMPP Control Panel Application kann man hier runterladen. Ist ein C-Programm. Dort finde ich zwar zwei Kommentare, die wohl für das stoppen zuständig sind ("Kill the first Apache process", "Kill the second Apache process"), aber der ausgeführte Befehl ("apache\\bin\\pv.exe -f -k -q -i [Prozess-ID]") ist seltsam. Weder im XAMPP-Ordner noch beim Standalone-Apache ist diese Anwendung zu finden...

Leider ist hier die Dokumentation irreführend. Der Teil den du weg gelassen hast ist entscheidend.
Zitat:
However, if you do have Apache installed as a service, the shortcut starts the service. If the Apache service is running already, the shortcut doesn't do anything.
Ich dachte auch zuerst, dass es so funktionieren kann. Habe auch von ShellExecute() den Rückgabewert 42 erhalten, aber der Prozess wurde nicht beendet. Wenn man dann in der Konsole den Befehl eingibt erhält man die Meldung "The Apache2.2 service is not started.".

Sir Thornberry, danke für den Tipp. Das werde ich ausprobieren. Tatsächlich hatte ich auf der Seite von SendMessage schon auf den Link zu PostMessage geklickt, aber nicht auf den darauf folgenden... :)

Geändert von Alien426 (29. Aug 2010 um 20:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.993 Beiträge
 
Delphi 12 Athens
 
#6

AW: Prozess sanft beenden (ohne Fenster)

  Alt 29. Aug 2010, 21:13
Ja, Tschuldschung, früher hieß die Windows-Variante mal WAMP (für Linux LAMP).

Im Root-Verzeichnis von XAMP liegen auch einige Batchdateien.

Zitat von apache_start.bat:
@echo off
echo Diese Eingabeforderung nicht waehrend des Running beenden
echo Bitte erst bei einem gewollten Shutdown schliessen
echo Please close this command only for Shutdown
echo Apache 2 is starting ...

apache\bin\httpd.exe

if errorlevel 255 goto finish
if errorlevel 1 goto error
goto finish

:error
echo.
echo Apache konnte nicht gestartet werden
echo Apache could not be started
pause

:finish
Zitat von apache_stop.bat:
@echo off
apache\bin\pv -f -k httpd.exe -q
if not exist apache\logs\httpd.pid GOTO exit
del apache\logs\httpd.pid

:exit
starten: apache\bin\httpd.exe .
stoppen: apache\bin\pv -f -k httpd.exe -q .
vielleicht reicht auch apache\bin\httpd.exe -q zum Stoppen
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

AW: Prozess sanft beenden (ohne Fenster)

  Alt 29. Aug 2010, 21:37
Zitat:
Habe auch von ShellExecute() den Rückgabewert 42 erhalten
Ich hoffe du hast diesen Wert nicht als ProcessID oder dergleichen interpretiert?! Schau mal ins MSDN, da wirst du sehen das es sich nicht wirklich um ein Prozesshandle handelt.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Alien426
Alien426

Registriert seit: 21. Dez 2005
146 Beiträge
 
Turbo Delphi für Win32
 
#8

AW: Prozess sanft beenden (ohne Fenster)

  Alt 29. Aug 2010, 21:46
Zitat:
Habe auch von ShellExecute() den Rückgabewert 42 erhalten
Ich hoffe du hast diesen Wert nicht als ProcessID oder dergleichen interpretiert?! Schau mal ins MSDN, da wirst du sehen das es sich nicht wirklich um ein Prozesshandle handelt.
Nein. Ich wollte nur wissen, ob die Ausführung mit dem Parameter "-k shutdown" erfolgreich (>32) war.

EDIT: Kannst du mir auf die Sprünge helfen, wie ich an einen/den Thread des Prozesses ran komme?

Geändert von Alien426 (29. Aug 2010 um 21:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Desmulator
Desmulator

Registriert seit: 3. Mai 2007
Ort: Bonn
169 Beiträge
 
#9

AW: Prozess sanft beenden (ohne Fenster)

  Alt 30. Aug 2010, 07:34
Wenn ich Apache verwende starte ich ihn ganz einfach über:
Code:
httpd -k start
Da nach ist das Konsolenfenster wieder verfügbar und Apache läuft im Hintergrund.
Zum Beenden benutze ich einfach:
Code:
httpd -k stop
Sonst weiß ich nicht was dein Problem ist.
Lars
  Mit Zitat antworten Zitat
Benutzerbild von Alien426
Alien426

Registriert seit: 21. Dez 2005
146 Beiträge
 
Turbo Delphi für Win32
 
#10

AW: Prozess sanft beenden (ohne Fenster)

  Alt 30. Aug 2010, 12:53
Wenn ich Apache verwende starte ich ihn ganz einfach über:
Code:
httpd -k start
Sonst weiß ich nicht was dein Problem ist.
Bitte aufmerksam lesen (vor allem wenn man den Stupid-Smiley verwendet).
Apache läuft auf USB-Stick und nicht als Service.

Du könntest übrigens auch einfach mit "net start apache2.2" starten. (Statt apache2.2 kann der Dienst auch mit anderem Namen registriert sein.)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz