Prozesse auslesen

Ich möchte abfragen ab wann alle Apache-Prozesse wirklich nicht mehr laufen, um anschließend die log-Dateien löschen zu können, die noch gesperrt sind, solange der Prozess noch läuft. Das fehlt mir bisher noch, zu wissen, jetzt läuft wirklich kein Apache-Prozess mehr, denn dann bleiben die log-Dateien liegen und werden mit der Zeit immer größer weil er bei jedem Starten dann die Infos einfach anhängt.

Muss sagen, das mit system (strApacheShutdown) habe ich bisher nicht ausprobiert, werd ich dann gleich mal machen :)

Wobei es denk am besten wäre, eine Funktion zu haben, die wirklich prüft ob alle Apache.exe's geschlossen sind. Blöd ist nämlich dass im Taskmanager auch noch 2 Apache.exe stehen, ich denke das liegt daran dass wir einmal eine Eingabeaufforderung haben, in der steht, dass der Apache läuft und dann noch die Apache.exe selber, anders kann ichs mir nicht erklären, weil wir mit CreateProcess eigentlich nur einmal den Apache starten.

Ganz schön kompliziert :eek:
Gruß
 
Irgendwie ist das echt komisch. Normalerweise sollte doch WaitforsingleObject warten bis der Prozess beendet ist, ich habe ja 10Sekunden eingestellt, aber er wartet gar nicht, sondern gibt ca. 1Sekunde später eine Message aus, die ich beim Löschen der Logs eingebaut habe, um zu sehen ob er schon löscht bevor der Apache heruntergefahren ist. wieso wartet er nicht? Habe ja diese While-Schleife mit Wait_timeout falls der Apache sich mal nicht runterfahren lässt, nicht dass er sonst hängenbleibt.

Hast du ne Idee wieso er nicht wartet bis hProcess wirklich beendet ist?

Gruß
 
Wobei es denk am besten wäre, eine Funktion zu haben, die wirklich prüft ob alle Apache.exe's geschlossen sind.
Und was willst du machen wenn es nicht so ist?

Könnte doch sein, das noch andere Apachen laufen, außer dem den du verwalten willst.
Blöd ist nämlich dass im Taskmanager auch noch 2 Apache.exe stehen, ich denke das liegt daran dass wir einmal eine Eingabeaufforderung haben, in der steht, dass der Apache läuft und dann noch die Apache.exe selber, anders kann ichs mir nicht erklären, weil wir mit CreateProcess eigentlich nur einmal den Apache starten.
Je nachdem startet Apache evlt. Kindprozesse von sich selbst.
Irgendwie ist das echt komisch. Normalerweise sollte doch WaitforsingleObject warten bis der Prozess beendet ist, ich habe ja 10Sekunden eingestellt, aber er wartet gar nicht, sondern gibt ca. 1Sekunde später eine Message aus, die ich beim Löschen der Logs eingebaut habe, um zu sehen ob er schon löscht bevor der Apache heruntergefahren ist. wieso wartet er nicht? Habe ja diese While-Schleife mit Wait_timeout falls der Apache sich mal nicht runterfahren lässt, nicht dass er sonst hängenbleibt.

Hast du ne Idee wieso er nicht wartet bis hProcess wirklich beendet ist?
Was ist der Rückgabewert der Funktion? Falls WAIT_FAILED, was gibt GetLastError zurück?

Warum nimmst du nicht einfach system()?

Gruß
 
Da hast du recht, könnten natürlich noch andere Apache laufen. sollten aber eigentlich nicht, aber könnte natürlich sein. Eigentlich möchte ich nur wissen, wann mein Apache heruntergefahren ist, um anschließend über c++ die log-Dateien zu löschen. Sollte doch eigentlich möglich sein.

Je nachdem startet Apache evlt. Kindprozesse von sich selbst.
Denke auch dass das einfach ein Kindprozess ist ;)

Was ist der Rückgabewert der Funktion? Falls WAIT_FAILED, was gibt GetLastError zurück?
Erhlichgesagt weiß ich nicht ob ich das richtig mache. Da ich Ausageben irgendwie über cout oder so nicht bekomme, sondern das immer über MessageBox mache *shameOnMe* ich habe es jetzt so gemacht:
sprintf(buffer, "%d", GetLastError());
MessageBox(NULL, buffer, "", MB_OKCANCEL);

da kommt dann error 5 raus, aber damit kann man nichts anfangen oder?

mit system beendet er zwar den Apache aber ich weiß dann doch trotzdem nciht den Zeitpunkt, wann er mit dem Herunterfahren des Apache's fertig ist oder wie könnte ich das herausfinden, wenn ich system() verwende. ich möchte ja wissen, wann alle Kindprozesse sozusagen beendet sind, um die log-dateien zu löschen

Gruß
 
Erhlichgesagt weiß ich nicht ob ich das richtig mache. Da ich Ausageben irgendwie über cout oder so nicht bekomme, sondern das immer über MessageBox mache *shameOnMe* ich habe es jetzt so gemacht:
sprintf(buffer, "%d", GetLastError());
MessageBox(NULL, buffer, "", MB_OKCANCEL);

da kommt dann error 5 raus, aber damit kann man nichts anfangen oder?
5 == ERROR_ACCESS_DENIED
mit system beendet er zwar den Apache aber ich weiß dann doch trotzdem nciht den Zeitpunkt, wann er mit dem Herunterfahren des Apache's fertig ist oder wie könnte ich das herausfinden, wenn ich system() verwende. ich möchte ja wissen, wann alle Kindprozesse sozusagen beendet sind, um die log-dateien zu löschen
system() führt ein Programm synchron aus. Der Apache Service wird über "net stop" beendet und wenn das Programm beendet ist und einen Rückgabewert von 0 hatte, ist auch der Apache beendet.

Du könntest ja evtl. auch einfach die Logdateien löschen bevor du den Apache startest.

Gruß
 
Was ich interessant finde, ich habe ja im TaskManager 2 Apache.exe, also ein Kindelement und einmal den richtigen Prozess. Dadurch geht er die Schleife if(strcmp(pe32.szExeFile, "Apache.exe")==0){...} zweimal durch, aber wenn ich if(WaitForSingleObject(hProcess, 10000) == WAIT_FAILED){} verwende, dann kommt ja bei GetLastError() 5 zurück, was wohl heißt "Access denied", soweit ich das gegoogelt habe, hoffe das stimmt. Dann kommt er beim 2.mal
if(strcmp(pe32.szExeFile, "Apache.exe")==0){
hProcess = OpenProcess( PROCESS_CREATE_PROCESS, FALSE, pe32.th32ProcessID );
if(hProcess ==null){
}else{
}
in die Schleife dass hprocess gleich null ist, wenn ich das if .... ==WAIT_FAILED auskommentiere, geht er den else-Zweig hProcess!=null zweimal durch.

WEnn ich nur wüsste, wie ich das anstellen soll. Eigentlich würde mir ja Apache herunterfahren mittel system() reichen und dann bräuchte ich noch eine Funktion, die prüft wann er denn wirklich heruntergefahren ist, aber irgendwie scheint das ja nicht zu gehen, weil er das ja eigentlich bei WaitForSingeObject tun sollte, wenn ich das richtig verstanden habe?

Gruß
 
Hi.

Letztendlich ist doch völlig egal ob da noch ein Apache Prozess läuft oder nicht. Es könnten auch andere Programme die Log-Dateien geöffnet haben (Anti-Virus Software, Backup Software, File Indexing Software, File Viewer etc.), so dass du die Dateien dann auch nicht löschen kannst.

Versuche einfach den Apache runter zu fahren und danach versuche die Dateien zu löschen, nach dem gleichen Schema wie es hier (http://support.microsoft.com/?scid=kb;en-us;316609&x=17&y=20) beschrieben ist.

Gruß
 
5 == ERROR_ACCESS_DENIED
Das kann man sozusagen nicht irgendwie umgehen oder?

system() führt ein Programm synchron aus. Der Apache Service wird über "net stop" beendet und wenn das Programm beendet ist und einen Rückgabewert von 0 hatte, ist auch der Apache beendet.
Der Befehl wurde vielleicht dann erfolgreich ausgeführt, aber bis der Apache wirklich heruntergefahren ist, dauerts oft noch ein paar Sekdunen.

Du könntest ja evtl. auch einfach die Logdateien löschen bevor du den Apache startest.
Ja ist auch eine Möglichkeit aber schöner wäre es anders geklappt hätte, so muss ich ja prüfen, ob es die logs gibt, wenn ja dann löschen.

Hi.

Letztendlich ist doch völlig egal ob da noch ein Apache Prozess läuft oder nicht. Es könnten auch andere Programme die Log-Dateien geöffnet haben (Anti-Virus Software, Backup Software, File Indexing Software, File Viewer etc.), so dass du die Dateien dann auch nicht löschen kannst.
ja das stimmt schon, verstehe halt nicht, wieso ich nicht das Recht habe, den Apache zu beenden bzw den Prozess zu beobachten und zu warten bis er beendet ist. denn ich habe ihn ja gestartet, aber gut anscheinend muss ich damit leben, dass ich den Apache herunterfahren kann aber es nicht klappt, ein Signal zu bekommen (also so lange zu warten) bis er wirklich heruntergefahren ist, um die logs anschleißend zu löschen.

Versuche einfach den Apache runter zu fahren und danach versuche die Dateien zu löschen, nach dem gleichen Schema wie es hier (http://support.microsoft.com/?scid=k...6609&x=17&y=20) beschrieben ist.

Gruß
Kann ich die Dateien nicht auch einfach mit DeleteFile(strHTTPD); löschen?

Viele Grüße und vielen Dank im Voraus
 
Habe jetzt nochmal eine Frage, habe bisher das Programm ja nur mittels klick auf die exe getestet, habe es jetzt mal in das Programm integriert, in dem ich es verwenden möchte und anscheinend wird die Internet Explorer Seite zu langsam geschlossen bzw alle Prozesse die dazugehören, so dass er bei system Probleme macht und bei GetProcessList() den Apache-Prozess nicht beendet. Habe jetzt überlegt ob vielleicht ein sleep() helfen könnte. Weißt du welche .h ich da includen müsste, dass es funktioniert bzw. hast du eine Idee, was ich sonst machen könnte? So langsam bin ich echt gefrustet :(

Gruß
 
Das kann man sozusagen nicht irgendwie umgehen oder?
Laut MSDN:
PROCESS_ALL_ACCESS All possible access rights for a process object.
Windows Server 2003 and Windows XP/2000: The size of the PROCESS_ALL_ACCESS flag increased on Windows Server 2008 and Windows Vista. If an application compiled for Windows Server 2008 and Windows Vista is run on Windows Server 2003 or Windows XP/2000, the PROCESS_ALL_ACCESS flag is too large and the function specifying this flag fails with ERROR_ACCESS_DENIED. To avoid this problem, specify the minimum set of access rights required for the operation. If PROCESS_ALL_ACCESS must be used, set _WIN32_WINNT to the minimum operating system targeted by your application (for example,
#define _WIN32_WINNT _WIN32_WINNT_WINXP
). For more information, see Using the Windows Headers.
Evtl. ist das das Problem.
Der Befehl wurde vielleicht dann erfolgreich ausgeführt, aber bis der Apache wirklich heruntergefahren ist, dauerts oft noch ein paar Sekdunen.
Hast du das wirklich ausprobiert? Das kann ich mir eigentlich nicht vorstellen, der "net stop" Befehl wartet eigentlich extrem lange bis ein Service wirklich gestoppt wurde.
Ja ist auch eine Möglichkeit aber schöner wäre es anders geklappt hätte, so muss ich ja prüfen, ob es die logs gibt, wenn ja dann löschen.
Generell ist es besser etwas einfach zu versuchen und dann zu prüfen ob es geklappt hat. Vorher zu prüfen ob die Datei da ist kann man sich sparen, man weiß dann ja trotzdem nicht ob das Löschen erfolgreich ist. Wenn du ERROR_FILE_NOT_FOUND zurück bekommst, dann ist doch auch OK.
ja das stimmt schon, verstehe halt nicht, wieso ich nicht das Recht habe, den Apache zu beenden bzw den Prozess zu beobachten und zu warten bis er beendet ist. denn ich habe ihn ja gestartet, aber gut anscheinend muss ich damit leben, dass ich den Apache herunterfahren kann aber es nicht klappt, ein Signal zu bekommen (also so lange zu warten) bis er wirklich heruntergefahren ist, um die logs anschleißend zu löschen.
Als Service wird der Apache vermutlich unter einem System-Konto ausgeführt, eben nicht unter dem gleichen Konto.
Kann ich die Dateien nicht auch einfach mit DeleteFile(strHTTPD); löschen?
Nein. Lies dir den Artikel durch. Es kann immer irgendwelche (gleichzeitigen) Zugriffe auf Dateien geben. Damit muss man leben und entsprechend handeln.

Du solltest dir Gedanken machen was du willst und vor allem was du machst wenn etwas schief geht.

Was ist wenn der Apache nicht runterfährt? Willst du ewig auf das Beenden vom Häuptling warten?

Was ist wenn du die Datei nicht löschen kannst obwohl der Apache runtergefahren ist (weil ein anderer Prozess die Datei geöffnet hat oder weil du gar nicht die Rechte hast)?

Bei mir funktioniert folgendes einwandfrei:
C:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int ret = system("c:/xampp/apache/bin/httpd -k shutdown");
    if (ret != 0) {
        perror("apache shutdown");
        return ret;
    } else {
        int retries = 0;
        const int maxRetries = 20;
        const int wait_msecs = 250;
        int err = ERROR_SUCCESS;

        while (++retries <= maxRetries &&
               !DeleteFile("c:/xampp/apache/logs/error.log") &&
               (err = GetLastError()) == ERROR_SHARING_VIOLATION)
        {
            puts("waiting...");
            fflush(stdout);
            Sleep(wait_msecs);
        }
        if (err == ERROR_FILE_NOT_FOUND ||
            err == ERROR_SUCCESS)
        {
            return 0;
        } else {
            return 1;
        }
    }
}
Ich habe jedesmal die Ausgabe bekommen:
Code:
The Apache2.2 service is stopping.
The Apache2.2 service has stopped.
In keinem Fall wurde die Schleife betreten.

Gruß
 
Zurück