Surveillance d'un exe

furax13 Messages postés 90 Date d'inscription mardi 28 octobre 2003 Statut Membre Dernière intervention 24 avril 2008 - 18 janv. 2005 à 15:43
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 - 20 janv. 2005 à 16:56
bonjour,
sur un poste windows 2000, je lance une application qui doit tourner 24h/24. (exécutable développé en delphi win32)

Comment faire pour que, en cas de plantage ou de fermeture par l'utilisateur, l'application soit relancée automatiquement?

La surveillance (un autre exécutable) pourrait être effectuée par exemple toutes les minutes.

Merci d'avance

4 réponses

jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
18 janv. 2005 à 16:29
L'exe que tu lances 24/24h c'est toi qui l'a crée ou non ? Enfin tu en as les sources ou pas?

Bonne prog,
JMP77.

N'oubliez pas de cliquer sur réponse acceptée.
0
furax13 Messages postés 90 Date d'inscription mardi 28 octobre 2003 Statut Membre Dernière intervention 24 avril 2008
18 janv. 2005 à 19:56
L'exe que je dois surveiller m'appartient et j'ai les codes sources.
0
furax13 Messages postés 90 Date d'inscription mardi 28 octobre 2003 Statut Membre Dernière intervention 24 avril 2008
19 janv. 2005 à 08:33
J'ai fait un petit programme de surveillance :
- le programme se met dans la base de registre et est lancé à chaque démarrage du PC quelque soit l'utilisateur
- le programme se met dans la barre des tâches et l'IHM est caché.
- je crée un fichier de log
- je lance l'exe à surveiller et je le redémarre dès qu'il s'arrête.

Unit du programme de surveillance :
unit MainSurv;


interface


uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,
Registry,
Hotlog {composant de gestion de traces trouvé sur le net };


type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;


implementation


{$R *.DFM}


// #####################################################################


procedure TForm1.FormCreate(Sender: TObject);
var
//Ecriture dans la base de registre
Reg: TRegistry;
ProgramPath: string;
nomFichierCourant: string;


//Gestion de l'application en mode surveillance-relance
StartInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
Fin: Boolean;


// Fichier pour la Gestion des logs pour la non-régression
LogNR: THotLog;


begin
//Lancement automatique de mon appli dans la base de registre au démarrage de Windows
Reg := TRegistry.Create;
try
with Reg do
begin
RootKey := HKEY_LOCAL_MACHINE; // A l'ouverture d'une session de chaque utilisateurs


if OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', False) then
WriteString('SurvRecuit.exe', Application.exename);
end;
finally
Reg.Free;
end;


//Paramétrage du fichier de log pour la non régression
LogNR := THotLog.create;


// Récupére le path complet du programme
ProgramPath := ExtractFilePath(Application.exename);
nomFichierCourant := ProgramPath + 'SurvRecuit.log';


//A chaque redemarrage du surveillant, on supprime l'ancien fichier de log.
if FileExists(nomFichierCourant) then
DeleteFile(nomFichierCourant);


// Nom du fichier de log
LogNR.hlWriter.hlFileDef.ddname := 'SurvRecuit';


// Démarrage de l'écriture dans le fichier de log des non-régression ;
LogNR.StartLogging;
LogNR.add('/***********************************************************/');


// Both date and time, space separator (yyyy-mm-dd hh:mm:ss)
LogNR.add('Date de lancement de l application : {now}');


// The name of the programm
LogNR.add('Nom de l exécutable : {app_name}');


// The path of the programm
LogNR.add('Répertoire de l application: {app_path}');
LogNR.add('/***********************************************************/');


{ Mise à zéro de la structure StartInfo }
FillChar(StartInfo, SizeOf(StartInfo), #0);


{ Seule la taille est renseignée, toutes les autres options }
{ laissées à zéro prendront les valeurs par défaut }
StartInfo.cb := SizeOf(StartInfo);


//On cache l'application de la barre des tâches
ShowWindow(Application.Handle, SW_HIDE);


{ Lancement de la ligne de commande }
if CreateProcess(nil, '"C:\csv3\ExtractCsv.exe"', nil, nil, False,
0, nil, nil, StartInfo, ProcessInfo) then
begin
{ L'application est bien lancée, on va en attendre la fin }
{ ProcessInfo.hProcess contient le handle du process principal de l'application }
Fin := False;


repeat
{ On attend la fin de l'application }
case WaitForSingleObject(ProcessInfo.hProcess, 200) of
WAIT_OBJECT_0:
begin
LogNR.add('Application terminée. On la relance. {now}');


//On relance le programme
CreateProcess(nil, '"C:\csv3\ExtractCsv.exe"', nil, nil, False,
0, nil, nil, StartInfo, ProcessInfo);


//trace de relance
LogNR.add('Application Relancée. {now}');
end;
WAIT_TIMEOUT: ; { elle n'est pas terminée, on continue d'attendre }
end;
{ Mise à jour de la fenêtre pour que l'application ne paraisse pas bloquée. }
Application.ProcessMessages;
until Fin;


//On stoppe la gestion des traces
LogNR.free;
end
else
RaiseLastOSError;
end;


end.

L'application à surveiller se nomme : C:\csv3\ExtractCsv.exe.

dans le main de l'unit de ExtractCsv.exe, j'ai rajouté le code suivant :

SetLastError(NO_ERROR);
CreateMutex (nil, False, 'Nom de l application');
if GetLastError = ERROR_ALREADY_EXISTS
then Exit;

cela permet de ne lancer l'application qu'une seule fois.
0
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
20 janv. 2005 à 16:56
Et bien je pense que tu as trouvé ta solution tout seul.



Felicitations.

Bonne prog,
JMP77.

N'oubliez pas de cliquer sur réponse acceptée.
0