Форум: "Начинающим";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];
ВнизОжидание завершения программы из сервиса Найти похожие ветки
← →
race1 (2007-09-10 10:41) [0]Мне надо запустить из сервиса программу и после какого-то времени, если программа не завершится, убить её. Сделал тестовое приложение как vcl form app, всё работает.
Вот код:var
si: TStartupInfo;
pi: TProcessInformation;
begin
ZeroMemory(@si, SizeOf(si));
si.cb := SizeOf(si);
CreateProcess(PChar(ProgramName), PChar(ProgramParams), nil, nil, FALSE, 0, nil, nil, si, &pi);
if WaitForSingleObject(pi.hProcess, 60000) <> WAIT_OBJECT_0 then
TerminateProcess(pi.hProcess, 1);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
...
Сделал запуск и ожидание в сервисе - WaitForSingleObject завершается сразу, и говорит "WAIT_OBJECT_0", хотя запущенная программа работает. Если узнать код возврата (GetExitCodeProcess(pi.hProcess, &ret)), то ret будет единицей.
← →
Reindeer Moss Eater © (2007-09-10 10:42) [1]CreateProcess - это функция
← →
clickmaker © (2007-09-10 10:42) [2]
> Мне надо запустить из сервиса программу
зачем? она что должна сделать?
← →
race1 (2007-09-10 10:49) [3]>Reindeer Moss Eater
Обработка возвращаемых значений опущена
>clickmaker
Есть задание, которое надо выполнять с заданной периодичностью (раз в две минуты, например), надо вызывать батник во время выполнения задания. Батник может быть написан криво, например, там будет команда pause. Т.е. остальных итераций не будет и сервис тупо повиснет.
← →
Reindeer Moss Eater © (2007-09-10 10:50) [4]Обработка возвращаемых значений опущена
Гетластеррор вызывал после того, как createprocess вернул тебе False?
Ну и фик ли ты хочешь?
← →
race1 (2007-09-10 10:54) [5]CreateProcess работает, я же говорю, в реальном коде есть проверка ошибок. CreateProcess возвращает true.
← →
clickmaker © (2007-09-10 10:57) [6]
> Батник может быть написан криво, например, там будет команда
> pause
а почему бы не писать батник прямо?
программы для работы под ковром всеж-таки должны отличаться от интерактивных, разве нет?
← →
Anatoly Podgoretsky © (2007-09-10 10:59) [7]> race1 (10.09.2007 10:54:05) [5]
А зачем нам обсуждать заведомо не реальный код.
Может ты Кеннеди убил и "мамой клянусь - это не я"
← →
Сергей М. © (2007-09-10 11:01) [8]
> говорит "WAIT_OBJECT_0", хотя запущенная программа работает
Так не бывает.
WAIT_OBJECT_0 однозначно говорит, что интересующий процесс завершился.
← →
race1 (2007-09-10 11:01) [9]>clickmaker
Хочется сделать защиту от дурака :)
А по вопросу всё-таки - почему процесс сигналит сразу, а не после завершения?
← →
Сергей М. © (2007-09-10 11:04) [10]
> почему процесс сигналит сразу, а не после завершения?
Процесс сигналит сразу после завершения.
После завершения процесс сразу сигналит.
Процесс не сигналит, если он не завершился.
Если процесс не завершился. то он не сигналит.
Что непонятно ?
← →
race1 (2007-09-10 11:06) [11]>Сергей М.
Ок. Тогда что такое запущенный процесс cmd.exe, висящий в процессах, выполняющий батник, в котором одна строка pause, запущенный сервисом? :)
>Anatoly Podgoretsky
Ну вообще-то код такой:var
si: TStartupInfo;
pi: TProcessInformation;
begin
ZeroMemory(@si, SizeOf(si));
si.cb := SizeOf(si);
if not CreateProcess(PChar(ProgramName), PChar(ProgramParams), nil, nil, FALSE, 0, nil, nil, si, &pi) then
Exit;
if WaitForSingleObject(pi.hProcess, 60000) <> WAIT_OBJECT_0 then
TerminateProcess(pi.hProcess, 1);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
...
← →
clickmaker © (2007-09-10 11:07) [12]
> Хочется сделать защиту от дурака
а почему не сделать защитой от дурака файлик readme.txt с коротенькой инструкцией по написанию батников? Что, дескать, не надо там паузу вставлять
Почему вместо того, чтобы грабли убрать, надо ручку обивать паралоном? )
← →
Сергей М. © (2007-09-10 11:10) [13]
> что такое запущенный процесс cmd.exe, висящий в процессах
Он есть все что угодно, но только не тот самый, который тебе просигналил. Если он тебе вообще просигналил.
← →
Anatoly Podgoretsky © (2007-09-10 11:12) [14]> clickmaker (10.09.2007 11:07:12) [12]
Шлем надо надевать.
← →
Reindeer Moss Eater © (2007-09-10 11:32) [15]> говорит "WAIT_OBJECT_0", хотя запущенная программа работает
ну вот например такой батник:
start notepad.exe
← →
race1 (2007-09-10 11:43) [16]Вот что было: если в параметре lpApplicationName задавать полный путь к батнику, функция завершается успешно, но getlasterror говорит что "указанный модуль не найден". Хотя батник отрабатывает - проверил это созданием файла. Да и в процессах он висит (cmd.exe).
Если первому параметру задавать %windir%\system32\cmd.exe /c "bat_filename params", то всё работает как надо...
Засада...
← →
Reindeer Moss Eater © (2007-09-10 11:55) [17]Никакой засады, если знать какой у сервиса текущий каталог по дефолту.
← →
Сергей М. © (2007-09-10 11:59) [18]
> race1
Нафиг нужен cmd, когда есть WScript/CScript ?
← →
race1 (2007-09-10 12:18) [19]>Reindeer Moss Eater
%windir%\system32. И что это меняет? Путь к батнику был полный, батник не был на сетевом/виртуальном диске. Он запускался и работал<b/>, он создавал файлы и висел в процессах. CreateProcess говорил что "всё ок, процесс создан". А на самом деле getlasterror говорил что "модуль не найден" и waitforsingleobject не работала как надо.
>Сергей М.
Батника для той задачи, для которой он создаётся, хватает за глаза - выполнить другую консольную программку, передав ей пару параметров, может быть выполнить пару консольных программок и может удалить/создать файлик. Вы ещё скажите сделать механизм плагинов и вместо батников писать dll на любом языке, ибо "нафик wsh, когда есть дельфи/си/и т.д." :(
← →
Сергей М. © (2007-09-10 13:31) [20]
> race1 (10.09.07 12:18) [19]
Ликбез
http://www.podgoretsky.com/ftp/Docs/WSH/Klimov/
← →
race1 (2007-09-10 13:38) [21]>Сергей М.
Я знаю что такое wsh и на нём даже написан целый один скрипт :) В остальном нам в работе хватает батников.
← →
Slym © (2007-09-10 14:01) [22]у запускай процесс в Job"е на Job много всяких разных ограничений поставить можно: память, время, дочерние процессы
← →
Anatoly Podgoretsky © (2007-09-10 14:03) [23]> race1 (10.09.2007 13:38:21) [21]
Пришло время написать второй.
← →
Slym © (2007-09-10 14:04) [24]например http://forum.sources.ru/index.php?showtopic=95439
← →
Slym © (2007-09-10 14:07) [25]http://rosigma.boom.ru/richter/head5.htm
← →
race1 (2007-09-10 14:15) [26]>Slym
Спасибо, но createprocess мне вполне хватит :)
← →
Slym © (2007-09-11 05:10) [27]race1 (10.09.07 14:15) [26]
Зря... а если порожденый процесс породит еще чтонить... как гасить будешь?
← →
race1 (2007-09-11 13:46) [28]>Slym
Никак... :) Позже можно посмотреть в эту сторону, пока хватит CreateProcess.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.053 c