Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перезапуск службы после остановки системой


Страницы:   1 2

И. Павел ©   (2011-12-16 09:37:00) 

Здравствуйте.

У меня есть служба. В администрирование->службы указал тип запуска: авто и перезапуск службы в случае ошибки. Но при остановке система не перезапускает службу.
Пробовал обернуть код в «main» функции в try/finally и назначать ExitCode := 1. Пробовал выводить исключение нуружу из OnExecute (в этом случае система пишет в журнал, что «service failure», но все равно ее не перезапускает).
Подскажите, пожалуйста, как сделать так, чтобы лыжи ехали?

Заранее спасибо.

PS: на всякий случай приведу код onExecute-метода:

procedure TSEDDeloMonitoringYITService2.ServiceExecute(Sender: TService);
var d: TDateTime;
begin
 try
   PrepareReg;

   CoInitialize(nil);
   DMQ.Connect('Provider=SQLOLEDB.1;Password=111;Persist Security Info=True;User ID=tm;Data Source=SQL-SERVER\DELO');

   MailThread := TMailThread.Create(false);

   while (not Terminated) do
   begin

     if MailThread.Finished then
       break;

     d := now;

     ShowPosDoc1;
     ReportStatus;
     ServiceThread.ProcessRequests(false);
     if Terminated then break;

     ShowPosDoc2;
     ReportStatus;
     ServiceThread.ProcessRequests(false);
     if Terminated then break;

     ShowPor;
     ReportStatus;
     ServiceThread.ProcessRequests(false);
     if Terminated then break;

     ShowNap;
     ReportStatus;
     ServiceThread.ProcessRequests(false);
     if Terminated then break;

     ShowOtch;
     ReportStatus;
     ServiceThread.ProcessRequests(false);
     if Terminated then break;

     ShowPosDoc8;
     ReportStatus;
     ServiceThread.ProcessRequests(false);
     if Terminated then break;

     SetEmailFlag;
     ReportStatus;
     ServiceThread.ProcessRequests(false);
     if Terminated then break;

     SetLastProcessing;
     ReportStatus;
     ServiceThread.ProcessRequests(false);
     if Terminated then break;

     d := now + (GetInterval — trunc((Now — d) * 24 * 60)) / 60 / 24;
     while (now < d) and (not Terminated) do
     begin
       sleep(1000);
       ReportStatus;
       ServiceThread.ProcessRequests(false);
     end;
   end;

   MailThread.Terminate;
   MailThread.WaitFor;

   CoUninitialize;
 except
   on e: Exception do
     ExceptHandler(e);
 end;
end;


sniknik   (2011-12-16 10:55:00) [21]

if MailThread.Finished then
      break;

if MailThread.Finished then
      raise ....;


sniknik   (2011-12-16 10:53:00) [22]

> а потом поток останавливается.
именно что останавливается, в этом случае, даже по  
 except
   on e: Exception do
     ExceptHandler(e);
 end;
идет нормальное (с точки зрение менеджера служб) завершение, т.е. служба все свое сделала и остановилась.

или тоже
> в чём принципиальная разница для пользователя?
так? вы не свои принципы отстаиваете, вы пишете под мелкосовтские...

> Сказал бы проще = переписать все нафиг
как обычно, это по умолчанию. меняются только объяснения почему...


Anatoly Podgoretsky   (2011-12-16 10:36:00) [23]

> sniknik  (16.12.2011 09:53:01)  [1]

Сказал бы проще = переписать все нафиг


И. Павел   (2011-12-16 10:30:00) [24]

> [6] И. Павел ©   (16.12.11 10:28)

Т.е. если администратор или система начнут останавливать службу, хочу успеть подать об этом сигнал в журнал и на почту. Если долго не отвечать, боюсь, служба просто сбросится системой.


И. Павел   (2011-12-16 10:28:00) [25]

> Просто хочу, чтобы система доходила до ExceptionHandler
> в случае чего.

Это по поводу вопроса о том, почему я часто проверяю пришедшие события. В коде пока я этого не прописал, но в самом конце блока try еще добавлю сообщение о том, что служба собирается останавливается.


И. Павел   (2011-12-16 10:25:00) [26]

> CoInitialize делается на поток... в показаном потоке сервиса
> что-то не видно работы с COM.

У меня в функциях — по паре больших запросов к MS SQL SERVER. Выполняются примерно 1-2 сек, поэтому после этого решил обрабатывать события. Чтобы в случае чего поток откликался хотя бы 1 раз в 2 секунды.
В потоке — свой CoInitialize. Поток выполняется долго, поэтому не хочу перемешивать его с основным кодом OnExecute, который выполняется быстрее но чаще.


> почему не освобождается кстати?)  

Спасибо, забыл Free сделать.

Просто хочу, чтобы система доходила до ExceptionHandler в случае чего.


> чтобы перезапустило, нужно чтобы служба «отвалилась», у
> тебя при ошибке/«зависе» в MailThread служба работает, не
> работает только твоя «работа».

Я пробовал в самом OnExecute генерировать исключение. И даже удалял блок except, чтобы это исключение прошло дальше. Все равно служба не перезапускается.
А если в MailThread возникает исключение, то информация о нем пишется, а потом поток останавливается. А главный поток проверяет: если дополнительный остановился, то останавливается и служба:
if MailThread.Finished then
      break;



> а оно вообще работает?
> у меня вот служба Visual SVN Server не стартует при включении
> компьютера (не то, чтобы всегда — иногда и стартует).

Служба работает. При запуске системы стартует.


> Приходится писать в автозагрузке net start.

А это идея: в крайнем случае тоже пропишу в свойствах сервиса в поле запуска программы при остановке службы команду для старта службы.


RWolf   (2011-12-16 10:21:00) [27]


> sniknik ©   (16.12.11 10:20) [3]

а в чём принципиальная разница для пользователя? для него это тоже сбой.


sniknik   (2011-12-16 10:20:00) [28]

> не стартует при включении компьютера ... перезапуск при сбое через 5 минут — всё то же самое.
какой может быть перезапуск, если оно и раза то не запустилось...


RWolf   (2011-12-16 10:15:00) [29]

> Но при остановке система не перезапускает службу.  

а оно вообще работает?
у меня вот служба Visual SVN Server не стартует при включении компьютера (не то, чтобы всегда — иногда и стартует). Прописываю в настройки службы перезапуск при сбое через 5 минут — всё то же самое. Приходится писать в автозагрузке net start.


sniknik   (2011-12-16 09:53:00) [30]

CoInitialize делается на поток... в показаном потоке сервиса что-то не видно работы с COM.
может оно конечно в Show... процедурах, но какое вообще шоу в сервисе?
работа в MailThread? (почему не освобождается кстати?)  тогда зачем ProcessRequests( false);? т.е. какой смысл возврата в основной цикл и какие то обработки, причем так часто, если "работаем" в MailThread?
не понятно, только куча лишнего кода.

> Но при остановке система не перезапускает службу.  
чтобы перезапустило, нужно чтобы служба "отвалилась", у тебя при ошибке/"зависе" в MailThread служба работает, не работает только твоя "работа".
перенеси код из дополнительного потока в основной,от службы. тогда от при сбое будет останавливаться и служба пере запускаться.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо