Служба Windows самоперезапуск.

Вопросы программирования и использования среды Lazarus.

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

jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Служба Windows самоперезапуск.

Сообщение jsa »

Здравствуйте.
Такой вопрос.
Есть ли способ службе windows сделать само-перезапуск? Или нужно запускать внешний батник через TProcess без poWaitOnExit с передачей PID в командной строке. И там уже обычным taskkill /F /PID %id% прибивать процесс и запускать по новой?
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 836
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

Вкладка "Восстановление" в свойствах службы.
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Основная проблема в "сервисе/службе виндовс" в том что там нет хембела (Handle) окна(/приложения) и соответственно, все, что требует привязки к "родителю" работает через пень колоду и вроде бы TProcess не исключение .
Последний раз редактировалось Alex2013 22.10.2024 11:39:55, всего редактировалось 1 раз.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Alex2013 писал(а):Основная проблема в "службе виндовс" в том что там нет хембела (Handle) окна(/приложения) и соответственно, все, что требует привязки к "родителю" работает через пень колоду и вроде бы TProcess не исключение .
При прямых руках, это не проблема.
xchgeaxeax
постоялец
Сообщения: 197
Зарегистрирован: 11.05.2023 02:51:40

Сообщение xchgeaxeax »

А надо именно процесс убивать? Или же пойдет

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

sc stop "имя службы" && sc start "имя службы"
или по старинке

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

net stop /y "имя службы" && net start "имя службы"
или через PowerShell

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

powershell -command "Restart-Service <имя службы>"
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

Sharfik писал(а):Вкладка "Восстановление" в свойствах службы.
Я не точно сформулировал.
Нужен программный перезапуск службы написанной на lazarus по условия. Саму себя перезапускать.
Видимо такого нет. Только через внешний батник.
MaratIsk
постоялец
Сообщения: 125
Зарегистрирован: 20.08.2009 18:15:20

Сообщение MaratIsk »

нонсенс какой-то?! служба для того и предназначена, чтобы работать круглосуточно. а если необходимо делать паузы, то sleep в руки
xchgeaxeax
постоялец
Сообщения: 197
Зарегистрирован: 11.05.2023 02:51:40

Сообщение xchgeaxeax »

jsa писал(а):Я не точно сформулировал.
Нужен программный перезапуск службы написанной на lazarus по условия. Саму себя перезапускать.
Видимо такого нет. Только через внешний батник.
Просто не понятно зачем вам это? Память течет?
Если надо программно перезапуститься, тогда просто выполните программно процедуры stop/start указываемые при регистрации службы.
sts
энтузиаст
Сообщения: 519
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение sts »

Кстати по поводу - память течет, использую для интеграции WebView4Delphi WebView2, таки да течет память, сначала стал периодически перегружать сайт в WebView, потом пересоздавать WebView, с каждым разом утечки уменьшались но все равно еще есть, что еще посоветуете?
сейчас снаружи перегружают
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Использовать Task Scheduler.
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

Снег Север писал(а):Task Scheduler
Именно. Кстати, тогда и непонятно зачем именно служба WIndows. Если просто запустить, некоторое время поработать и закрыться... Службы и демоны на то они и есть, чтобы работать постоянно
sts
энтузиаст
Сообщения: 519
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение sts »

ну очевидно если инициализация много времени занимает то лучше постоянно запущенную прогу иметь с очередью заданий, в моем случае непрерывная интеграция во много потоков, по идее надо написать прогу менеджер той кучки прог, руки еще не дошли. а вот почему утечка непонятно, конечно есть версия что движок хрома в принципе жадный до всех ресурсов, то есть поможет тока периодическая перезагрузка.
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

xchgeaxeax писал(а):Просто не понятно зачем вам это? Память течет?
Нужна такая возможность чтобы перезапускать раз в указанный период или по событию. Служб у меня несколько, работают с разными внешними объектами файлы, API, железки.
Иногда теряют коннект с объектами. причины всегда разные и с ними надо разбираться. Но службы уже используются и остановки не должны случаться.
В 99,9% простой перезапуск решает вопрос с этими подключениями.
Само собой это не основной метод, и в каждом случае приходится разбираться и реализовывать "защиту от дурака" чтобы обойти проблему или отработать возникшее исключение.
Но для этого достаточно логов, а службу надо перезапустить.
Т.е. временная заглушка, страховка от прекращения работы.

xchgeaxeax писал(а): Если надо программно перезапуститься, тогда просто выполните программно процедуры stop/start указываемые при регистрации службы.
Службу я останавливаю когда нужно (если утерян-отключен объект для работы).

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

Application.StopDaemons(true);
Включить "снаружи" службу я могу, но интересует можно ли запустить после остановки изнутри
StopDaemons это процедура в unit daemonapp;
там же есть procedure RunDaemons;
но не понятно откуда ее задействовать, и возможно ли это.
xchgeaxeax
постоялец
Сообщения: 197
Зарегистрирован: 11.05.2023 02:51:40

Сообщение xchgeaxeax »

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

Program TestDaemon;

Uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
  CThreads,
{$ENDIF}{$ENDIF}
  DaemonApp, lazdaemonapp, daemonmapperunit, DaemonUnit, DaemonWorkerThread,
  DaemonSystemdInstallerUnit, MyDaemonApplicationTerminated
  { add your units here };

begin
  Application.Initialize;
  while not ApplicationTerminated do Application.Run;
end.

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

unit MyDaemonApplicationTerminated;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils;

var
  ApplicationTerminated: Boolean = False;

implementation

end.
Но можете определить и TMyDaemon как потомок TDaemon с добавкой в виде поля Terminated и перегрузкой работы Run

ЗЫ Только такой перезапуск не закроет потерянные хэндлы, если они не закроются вашей программой корректно и они могут у вас утекать.
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Кстати, давно хотел спросить , сервис виндовс и служба виндовс это одно и тоже? И если да то можно ли использовать средства виндовс предназначенные для управления службами для контроля и обслуживания своего сервиса ?
Последний раз редактировалось Alex2013 22.10.2024 11:38:37, всего редактировалось 1 раз.
Ответить