Проблема при создании демона(сервиса) в Lazarus
Модератор: Модераторы
Проблема при создании демона(сервиса) в Lazarus
Пытаюсь создать кросс платформенное приложение-демон, или в винде сервис. При попытке запуска приложение не отключается от терминала и в логе появляется следующее:
DaemonService [2010-08-02 12:34:37.677 Info] Daemon Daemon1 current status: Start Pending
DaemonService [2010-08-02 12:34:37.677 Info] Failed to start daemon Daemon1 : Semaphore init failed (possibly too many concurrent threads)
Если есть какие-либо идеи, буду признателен.
И еще, стоит ubuntu-10.04-alternate-amd64.
DaemonService [2010-08-02 12:34:37.677 Info] Daemon Daemon1 current status: Start Pending
DaemonService [2010-08-02 12:34:37.677 Info] Failed to start daemon Daemon1 : Semaphore init failed (possibly too many concurrent threads)
Если есть какие-либо идеи, буду признателен.
И еще, стоит ubuntu-10.04-alternate-amd64.
Я пробовал запускать под windows - все работает(Сервис регистрируется в системе запускается и удаляется). Если вы напишите какие именно дополнительные модули необходимо подключить для ubuntu я буду вам очень благодарен!!!
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
Как?! Я сколько не пытался - не регистрируется сервис и всё тут T_T Расскажите, как сделали?
Как не регистрируется? Опишите ваши действия.
Добавлено спустя 18 минут 14 секунд:
Alexs модуль Interfaces по всей видимости не нужен был. Зато я в основнай программе изменил:
uses
{$IFDEF UNIX}
{$IFDEF UseCThreads}
CThreads,
{$ENDIF}
{$ENDIF}
...
на:
uses
{$IFDEF UNIX}
CThreads,
{$ENDIF}
...
Оказывается программа просто не проходила условие {$IFDEF UseCThreads} (хотя странно я главный модуль не менял).
Теперь у меня другая проблема демон не отключаеся от управляющего терминала.
запускаю коммандой:
./DaemonService -r
В логе теперь все нормально:
DaemonService [2010-08-04 11:52:17.617 Info] Daemon Daemon1 current status: Start Pending
DaemonService [2010-08-04 11:52:17.617 Info] Daemon Daemon1 current status: Running
DaemonService [2010-08-04 11:52:19.260 Info] Daemon Daemon1 current status: Stop Pending
DaemonService [2010-08-04 11:52:19.260 Info] Daemon Daemon1 current status: Stopped
Добавлено спустя 1 минуту 59 секунд:
Опишите как не регистрируется просто не компилируется или что-либо другое. Подробно опишите ваши действия.
Добавлено спустя 18 минут 14 секунд:
Alexs модуль Interfaces по всей видимости не нужен был. Зато я в основнай программе изменил:
uses
{$IFDEF UNIX}
{$IFDEF UseCThreads}
CThreads,
{$ENDIF}
{$ENDIF}
...
на:
uses
{$IFDEF UNIX}
CThreads,
{$ENDIF}
...
Оказывается программа просто не проходила условие {$IFDEF UseCThreads} (хотя странно я главный модуль не менял).
Теперь у меня другая проблема демон не отключаеся от управляющего терминала.
запускаю коммандой:
./DaemonService -r
В логе теперь все нормально:
DaemonService [2010-08-04 11:52:17.617 Info] Daemon Daemon1 current status: Start Pending
DaemonService [2010-08-04 11:52:17.617 Info] Daemon Daemon1 current status: Running
DaemonService [2010-08-04 11:52:19.260 Info] Daemon Daemon1 current status: Stop Pending
DaemonService [2010-08-04 11:52:19.260 Info] Daemon Daemon1 current status: Stopped
Добавлено спустя 1 минуту 59 секунд:
Brainenjii писал(а):Как?! Я сколько не пытался - не регистрируется сервис и всё тут T_T Расскажите, как сделали?
Опишите как не регистрируется просто не компилируется или что-либо другое. Подробно опишите ваши действия.
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
Файл -> Создать -> Daemon (service) application.
Save all -> %folder%
Получаю DaemonMapperUnit1 и DaemonUnit1. В DaemonMapperUnit в инспекторе обеъктов редактирую DaemonDefs:
Добавить -> DaemonClassName: TDaemon1; Description: Daemon1; DisplayName: Daemon1; Name: Daemon1; WinBindings -> UserName: System; StartType: stAuto;
Добавляю везде Begin перед RegisterMapper и RegisterDaemon (иначе ошибка) и назначаю обработку Start.
Получаю DaemonMapperUnit1:
и DaemonUnit1:
При попытке project1.exe -r - получаю
А project1.exe -i:
Второе, как понимаю, ошибка аутентификации... Если в WinBindings вводить администратора всё остаётся так же...
Save all -> %folder%
Получаю DaemonMapperUnit1 и DaemonUnit1. В DaemonMapperUnit в инспекторе обеъктов редактирую DaemonDefs:
Добавить -> DaemonClassName: TDaemon1; Description: Daemon1; DisplayName: Daemon1; Name: Daemon1; WinBindings -> UserName: System; StartType: stAuto;
Добавляю везде Begin перед RegisterMapper и RegisterDaemon (иначе ошибка) и назначаю обработку Start.
Получаю DaemonMapperUnit1:
Код: Выделить всё
Unit DaemonMapperUnit1;
{$mode objfpc}{$H+}
Interface
Uses
Classes, SysUtils, FileUtil, DaemonApp;
Type
TDaemonMapper1 = Class(TDaemonMapper)
Private
{ private declarations }
Public
{ public declarations }
End;
Var
DaemonMapper1: TDaemonMapper1;
Implementation
Procedure RegisterMapper;
Begin
RegisterDaemonMapper(TDaemonMapper1)
End;
{$R *.lfm}
Begin
RegisterMapper;
End.
и DaemonUnit1:
Код: Выделить всё
Unit DaemonUnit1;
{$mode objfpc}{$H+}
Interface
Uses
Classes, SysUtils, FileUtil, DaemonApp;
Type
{ TDaemon1 }
TDaemon1 = Class(TDaemon)
Procedure DataModuleStart(Sender: TCustomDaemon; Var OK: Boolean);
Private
{ private declarations }
Public
{ public declarations }
End;
Var
Daemon1: TDaemon1;
Implementation
Procedure RegisterDaemon;
Begin
RegisterDaemonClass(TDaemon1)
End;
{$R *.lfm}
{ TDaemon1 }
Procedure TDaemon1.DataModuleStart(Sender: TCustomDaemon; Var OK: Boolean);
Begin
Ok := TRUE;
With TStringList.Create Do
Begin
Add('123');
SaveToFile('C:\windows\system32\123.txt');
Free;
End;
end;
Begin
RegisterDaemon;
End.
При попытке project1.exe -r - получаю
D:\Develop\Daemon>project1.exe -r
An unhandled exception occurred at $7C91B1FA :
EAccessViolation :
$7C91B1FA
$7C901046
$0040ADB8
А project1.exe -i:
;D:\Develop\Daemon>project1.exe -i
exception at 00426F35:
System error, (OS Code 1057):
╚ь єўхЄэющ чряшёш чрфрэю эхтхЁэю шыш эх ёє∙хёЄтєхЄ, шыш цх эхтхЁхэ єърчрээ√щ яр
Ёюы№.
.
Второе, как понимаю, ошибка аутентификации... Если в WinBindings вводить администратора всё остаётся так же...
Запуск службы командой:
NameService -r
у меня тоже не работает. Выход из этого прост заходите в панель управления->администрирование->службы находите там свою службу (которая должна появиться после NameService -i) и устанавливаете тип запуска, запускаете ее и т.д.
Я попробовал запустить вашу программу в ней необходимо заменить имя пользователя с system на какое-либо другое (ну не нравится это винде!
). И желательно подправьте код:
unit DaemonUnit1;
...
Initialization {Замените begin}
RegisterDaemon;
End.
unit DaemonMapperUnit1;
...
Initialization {Замените begin}
RegisterMapper;
End.
Работать будет и с begin но так правильнее. Я все проверил работает. Если заработает у вас или нет в любом случае пишите.(самому интересно)
NameService -r
у меня тоже не работает. Выход из этого прост заходите в панель управления->администрирование->службы находите там свою службу (которая должна появиться после NameService -i) и устанавливаете тип запуска, запускаете ее и т.д.
Я попробовал запустить вашу программу в ней необходимо заменить имя пользователя с system на какое-либо другое (ну не нравится это винде!
unit DaemonUnit1;
...
Initialization {Замените begin}
RegisterDaemon;
End.
unit DaemonMapperUnit1;
...
Initialization {Замените begin}
RegisterMapper;
End.
Работать будет и с begin но так правильнее. Я все проверил работает. Если заработает у вас или нет в любом случае пишите.(самому интересно)
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
Не поменялось... Пробовал и доменного админа вписывать в WinBindings, и даже локального создал с логином и паролем в латинице (вдруг там с кодировкой проблемы) - и все-равно, OS Code 1057...
P.S. вот он, этот коварный демон
P.S. вот он, этот коварный демон
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Nik
- энтузиаст
- Сообщения: 573
- Зарегистрирован: 03.02.2006 23:08:09
- Откуда: Киров
- Контактная информация:
Столкнулся с похожей проблемой. Пытаюсь навоять службу (пока только для Win), Разобрал пример из Lazarus (lazarusexamplescleandircleandir.lpr). По образу и подобию навоял свой "демон". Он без проблем регистрируется в системе и даже запускается. Но вот код, прописанный на Daemon.OnStart (и на любые другие события - тоже) не выполняется. Ни строчки.
Прочитал мануал с freepascal.ru и из wiki - вроде всё правильно сделано.
Где там может быть косяк? Или это Lazarus/Win7 тупять?
Добавлено спустя 2 часа 13 минут 53 секунды:
Тупо переписал с нуля, уже без примеров. Теперь работает. Только завершаться нормально не хочет. При попытке остановки службы Windows ругается - мол, не могу завершить, хотя служба об ошибках не сообщает.
Прочитал мануал с freepascal.ru и из wiki - вроде всё правильно сделано.
Где там может быть косяк? Или это Lazarus/Win7 тупять?
Добавлено спустя 2 часа 13 минут 53 секунды:
Тупо переписал с нуля, уже без примеров. Теперь работает. Только завершаться нормально не хочет. При попытке остановки службы Windows ругается - мол, не могу завершить, хотя служба об ошибках не сообщает.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Необходимо отрабатывать событие Shutdown у службы и выходить из цикла repeat until закрывая сокет.
- Nik
- энтузиаст
- Сообщения: 573
- Зарегистрирован: 03.02.2006 23:08:09
- Откуда: Киров
- Контактная информация:
Сделал так:
Не помогло. Всё равно вылетает с громким криком.
Код: Выделить всё
procedure TSQLiteDaemon.DataModuleExecute(Sender: TCustomDaemon);
...
repeat
if NeedToExit then
begin
ListenerSocket.Free;
ConnectionSocket.Free;
break;
end;
...
until false;
...
procedure TSQLiteDaemon.DataModuleShutDown(Sender: TCustomDaemon);
begin
NeedToExit:=true;
end; Не помогло. Всё равно вылетает с громким криком.
Так вы используйте какой либо флаг при установке, которого необходимо завершить цикл с прослушкой сокета.
а вообще дам вам совет: перенесите код прослушки сокета в отдельный поток!
Код: Выделить всё
repeat
if ListenerSocket.canread(1000) then
....а вообще дам вам совет: перенесите код прослушки сокета в отдельный поток!
- Nik
- энтузиаст
- Сообщения: 573
- Зарегистрирован: 03.02.2006 23:08:09
- Откуда: Киров
- Контактная информация:
Mr.Smart писал(а):Так вы используйте какой либо флаг при установке, которого необходимо завершить цикл с прослушкой сокета.Код: Выделить всё
repeat
if ListenerSocket.canread(1000) then
....
Так я так и делю - NeedToExit как раз такой флаг и есть. Если он true - цикл прерываться должен.
Собственно, эксперименты показали, что ShutDown и Stop для Daemon'а вообще не вызываются. Пробовал в этих событиях писать в лог сообщения - лог пустой. Похоже, Windows прибивает демон в обход нормальной процедуры его завершения.
Так что непонятно, как вообще установить флаг выхода.
Приветствую всех. Подскажите куда делся мастер создания проекта сервиса(daemon) и как его вернуть?
вопрос снимаетя - нашел.
вопрос снимаетя - нашел.
