Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Системный сервис, перезапуск 
V
    Опции темы
lollollollol
Дата 9.5.2013, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Успешно создаю сервис следующим методом:

Код

    hNewService := CreateService(hSCMgr, Pchar(ServiceName), Pchar(ServiceDisp),
STANDARD_RIGHTS_REQUIRED, 
SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START, 
SERVICE_ERROR_IGNORE,
ExecutablePath, nil, nil, nil, nil, nil);
    CloseServiceHandle(hSCMgr);



Но есть необходимость автоматического перезапуска сервиса в случае если его завершают из диспетчера задач.
Я уже все варианты флагов перепробывал, которые более или менее по логике подходят(описание брал тут http://www.sources.ru/msdn/library/createservice.shtml)
Но всё безтолку. Это вообще возможно? Или нужно создавать второй процесс который будет следить за первым? мне не нравится такой вариант решения

Это сообщение отредактировал(а) lollollollol - 9.5.2013, 18:10
PM MAIL   Вверх
Poseidon
Дата 9.5.2013, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



Цитата(lollollollol @  9.5.2013,  18:09 Найти цитируемый пост)
Или нужно создавать второй процесс который будет следить за первым? мне не нравится такой вариант решения
Ну а кто по-твоему будет его запускать?  ОС? Оно ей надо?



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
kami
Дата 9.5.2013, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(lollollollol @  9.5.2013,  18:09 Найти цитируемый пост)
Это вообще возможно?

Возможно, при аварийном завершении сервиса.
Вот модуль, давно писал правда...
Оттуда нужно далеко не всё, а только разобраться с методом TServiceStatus.SetNewServiceStatus, а именно - со второй половиной этого метода.


Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  uServiceController.pas 62,43 Kb
PM MAIL WWW   Вверх
kami
Дата 9.5.2013, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(kami @  9.5.2013,  18:48 Найти цитируемый пост)
Возможно, при аварийном завершении сервиса.

Сюда же относится убийство процесса.

Это сообщение отредактировал(а) kami - 9.5.2013, 18:49
PM MAIL WWW   Вверх
lollollollol
Дата 10.5.2013, 06:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



У меня приложение разработано c одним uses windows.
Проект уже готов, но по задумке он должен себя перезапускать при сбое, или завершении процесса.

Подскажи пожалуйста, как нужно изменить код чтобы сервис перезапускался? На сколько я понимаю, нужно указать флаг. Какой-я не понял. 
Попытка изучить предоставленый тобой код не удалась.

Заранее очень благодарен за помощь!

Это сообщение отредактировал(а) lollollollol - 12.5.2013, 19:02
PM MAIL   Вверх
Akella
Дата 10.5.2013, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



Цитата(lollollollol @  10.5.2013,  06:11 Найти цитируемый пост)
но по задумке он должен себя перезапускать при сбое, или завершении процесса.


Разве такое возможно?
Это всё равно что сказать, что программа сама себя должна запустить с диска, не будучи запущеной.

Добавлено через 1 минуту и 28 секунд
Ты хоть раз заглядывал в службы windows? настройки служб смотрел?
PM MAIL   Вверх
lollollollol
Дата 10.5.2013, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Но ведь перезапуск сервиса возможен при при аварийном завершении, или я не прав?
PM MAIL   Вверх
kami
Дата 10.5.2013, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(Akella @  10.5.2013,  10:03 Найти цитируемый пост)
Разве такое возможно?

Да возможно это, возможно  smile 
Вкладка "восстановление" в свойствах служб.
Параметры меняются через ChangeServiceConfig2 с флагом SERVICE_CONFIG_FAILURE_ACTIONS. При создании службы такое невозможно.
lollollollol, ты код посмотрел?
Цитата(lollollollol @  10.5.2013,  06:11 Найти цитируемый пост)
У меня приложение разработано c одним uses windows.

Что мешает выдернуть только нужное, и остаться с одним Windows  в uses?
PM MAIL WWW   Вверх
Akella
Дата 10.5.2013, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



Да, возможно, но этим занимается непосредственно винда  smile 
PM MAIL   Вверх
kami
Дата 10.5.2013, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



только сейчас заметил.
Цитата(lollollollol @  10.5.2013,  06:11 Найти цитируемый пост)
Попытка изучить предоставленый тобой код не удалась.

Что значит - не удалась?
{$IFDEF offtop}
- какую ошибку выдал мозг при попытке изучения кода? желательно со скрином и конкретной строчкой, которая привела к ошибке.
- какая версия использовалась, на какой конфигурации проводилось изучение?
{$ENDIF}
 smile 
В общем - конкретнее, что вызвало затруднение.

Это сообщение отредактировал(а) kami - 10.5.2013, 17:41
PM MAIL WWW   Вверх
lollollollol
Дата 10.5.2013, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



Написал функцию ServicesReBoot

Вот так вызываю
Код

    CreateNTService(Pchar(F2), Pchar(ServiceName));
    ServicesReBoot(ServiceName);
    ServiceStart(Pchar(ServiceName));


Код отработал, но процесс не перезапускается при сбое


Это сообщение отредактировал(а) lollollollol - 12.5.2013, 19:03
PM MAIL   Вверх
kami
Дата 10.5.2013, 22:23 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(lollollollol @  10.5.2013,  22:09 Найти цитируемый пост)
Код отработал, но процесс не перезапускается при сбое

Пойдем по порядку:
1. 
Цитата(lollollollol @  10.5.2013,  22:09 Найти цитируемый пост)
FServiceHandle := OpenService(0, @ServiceName[1], $F01FF);

Почему здесь первым параметром стоит 0 ? И - надо бы анализировать, получилось ли получить FServiceHandle.
2. каждому OpenService должен соответствовать CloseServiceHandle, я бы вообще обернул это всё в try-finally.
3.
Цитата(lollollollol @  10.5.2013,  22:09 Найти цитируемый пост)
SrvFailureActions.cActions := 0;

А здесь почему 0?
4. 
Цитата(lollollollol @  10.5.2013,  22:09 Найти цитируемый пост)
GetMem(SrvFailureActions.lpsaActions, SizeOf(TSCActions));

Память выделена, замечательно. А кто будет заполнять массив lpsaActions правильными параметрами?

Добавлено через 9 минут и 16 секунд
И в дополнение.
Я бы посоветовал вместо GetMem использовать AllocMem
PM MAIL WWW   Вверх
lollollollol
Дата 11.5.2013, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 287
Регистрация: 12.3.2013

Репутация: нет
Всего: нет



1. 
Код

  HandleOpenSCManager:=OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  FServiceHandle := OpenService(HandleOpenSCManager, @ServiceName[1], $F01FF);

FServiceHandle успешно получен (исправил, спасибо!)

2. Сделал
Код

  r:=ChangeServiceConfig2(FServiceHandle, SERVICE_CONFIG_FAILURE_ACTIONS, @SrvFailureActions);
  CloseServiceHandle(FServiceHandle);

3. В Вашем примере:
  SrvFailureActions.cActions := NewStatus.ServiceFailureActions.cActions;
Где заполняется NewStatus.ServiceFailureActions.cActions не вижу, а по дефолту равно 0.

4. Так же не нашел какие параметры длжны быть переданы

lpCommand:=''; - Что нужно прописать тут?

Почему при выполнеии функции
  r:=ChangeServiceConfig2(FServiceHandle, SERVICE_CONFIG_FAILURE_ACTIONS, @SrvFailureActions);
програма вылетает с 
Runtime error 216 at 77612428?

Это сообщение отредактировал(а) lollollollol - 12.5.2013, 19:01
PM MAIL   Вверх
kami
Дата 11.5.2013, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(lollollollol @  11.5.2013,  09:25 Найти цитируемый пост)
Где заполняется NewStatus.ServiceFailureActions.cActions не вижу, а по дефолту равно 0.

Можно же посмотреть, что означает этот параметр smile 
И лучше всего - смотреть первоисточник (тыдыщ)
А там написано: 
Цитата

If this value is 0, but lpsaActions is not NULL, the reset period and array of failure actions are deleted.

Итого - что получается при выполнении "адаптированного" кода?

Едем дальше. Ну зачем нужно было заменять определения структур? Ведь в первом приведенном коде было объявлено правильно: 
Код

lpsaActions: pSCActions;
, и выделение памяти под структуру было...


А сейчас - 
Код

lpsaActions: TSCAction;

????? Неудивительно, что возникает ашипка.

И далее - SrvFailureActions.lpsaActions.SCAction:=1; Какие значения может принимать SCAction советую посмотреть здесь, а то получается, что при сбое службы вы перезапускаете комп.

Это сообщение отредактировал(а) kami - 11.5.2013, 11:17
PM MAIL WWW   Вверх
Dik0n
Дата 11.5.2013, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.5.2011

Репутация: 1
Всего: 10



В свое время искал тоже, в итоге плюнул, пишу напрямую в реестр нужные параметры, на все виды збоев - перезапуск.
Бинарные данные:
Код

const
  FailureActions: array[0..43] of Byte =(
      $00, $00, $00, $00, $00, $00, $00, $00,
      $00, $00, $00, $00, $03, $00, $00, $00,
      $6E, $00, $31, $00, $01, $00, $00, $00,
      $00, $00, $00, $00, $01, $00, $00, $00,
      $00, $00, $00, $00, $01, $00, $00, $00,
      $00, $00, $00, $00);

Взял из Delphi проекта, приспособить думаю не проблема smile 
--------------------
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ ◄◄◄ Сотри монеткой защитный слой
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0801 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.