Поиск запущеного процесса

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Поиск запущеного процесса

Сообщение sign »

В Delphi для того, чтобы определить запущен ли денвер, а если нет, запустить, использую такой вот способ:

Код: Выделить всё

const PROCESS_TERMINATE=$0001;
var Co, fnd: Boolean;
    FS: THandle;
    FP: TProcessEntry32;
begin
  FS := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  FP.dwSize := Sizeof(FP);
  Co := Process32First(FS,FP);
  fnd := False;
  while integer(Co) <> 0 do begin
    if FP.szExeFile = 'TrayApache.exe' then begin
      fnd := True;
      Break;
    end;
    Co:=Process32Next(FS,FP);
  end;
  if not fnd then
    ShellExecute(0, 'open', 'E:\WebServers\denwer\Run.exe', nil, nil, 0);


В лазарусе запускаю каждый раз денвер, ибо не знаю, как проверить, запущен ли соответствующий процесс или нет.

Код: Выделить всё

var
   AProcess: TProcess;
begin
  AProcess := TProcess.Create(nil);
  AProcess.CommandLine := 'E:\WebServers\denwer\Run.exe';
  AProcess.Options := AProcess.Options + [poWaitOnExit];
  AProcess.Execute;
  AProcess.Free;   


Относительно Лазаруса - как определить, запущен некий сторонний процесс или нет?
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Код: Выделить всё

{$IFDEF windows}
  SomeWinAPIFunctionForCheckStatusOfProcess(SomeParams);
{$ENDIF}
{$IFDEF unix}
  SomeFunctionWithParsingOf_PS_AX_GREP_SOMEPROCESS_Result(SomeParams);
{$ENDIF}

Я бы делал так ^_^
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

Когда-то решал такую же проблему, правда не с Денвером, а с Mongoose. Тут есть ещё одна сложность: процесс сервера может быть запущен, но это может быть не наш процесс, а какой-то другой -- запущенный из другой директории, и для других целей. Никто же не запрещает пользователю держать на компе два денвера.

Поэтому для себя решил проблему так:
1) В htdocs сервера создаю директорию с идентифицирующим файлом, в котором хранится одна уникальная строка (GUID, название приложения, и т.п.)
2) В программе-запускалке с помощью Ararat Synapse подключаюсь к серверу, запрашиваю этот идентифицирующий файл, читаю оттуда строчку и сравниваю её с эталоном.
3) Если удалось подключиться, файл найден и строчка совпала -- значит наш сервер уже работает. В противном случае его нужно запустить.

Если интересуют исходники -- могу выложить.
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

Спасибо, не откажусь.
:D
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

См. приложенный архив. Это готовая программа, запускающая сервер и браузер на основе информации из конфигурационного файла. Пример конфигурационного файла лежит в ./bin, пример файла с идентифицирущей строчкой -- в ./htdocs. Исходник -- ./qlauncher.lpr, сабжевый код -- в методе TWebAppLauncher.WebServerIsRunning.
Для компиляции потребуется Ararat Synapse, исходники которого нужно будет положить в ./libs/synapse. Ещё есть зависимость от LCL (FileUtil.UTF8ToSys).
У вас нет необходимых прав для просмотра вложений в этом сообщении.
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

Спасибо.
Ответить