![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перезапуск службы после остановки системой
И. Павел © (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 служба работает, не работает только твоя "работа".
перенеси код из дополнительного потока в основной,от службы. тогда от при сбое будет останавливаться и служба пере запускаться.