Проблема при создании демона(сервиса) в Lazarus

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

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

Проблема при создании демона(сервиса) в Lazarus

Сообщение gorman » 03.08.2010 11:01:38

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

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.
gorman
незнакомец
 
Сообщения: 4
Зарегистрирован: 02.08.2010 16:31:07

Re: Проблема при создании демона(сервиса) в Lazarus

Сообщение alexs » 03.08.2010 21:25:47

Надо подключить доп. модули. Кажется мне - Interfaces должен быть. На память не помню - код на работе.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Проблема при создании демона(сервиса) в Lazarus

Сообщение gorman » 04.08.2010 11:39:48

Я пробовал запускать под windows - все работает(Сервис регистрируется в системе запускается и удаляется). Если вы напишите какие именно дополнительные модули необходимо подключить для ubuntu я буду вам очень благодарен!!!
gorman
незнакомец
 
Сообщения: 4
Зарегистрирован: 02.08.2010 16:31:07

Re: Проблема при создании демона(сервиса) в Lazarus

Сообщение Brainenjii » 04.08.2010 12:09:11

Как?! Я сколько не пытался - не регистрируется сервис и всё тут T_T Расскажите, как сделали?
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Проблема при создании демона(сервиса) в Lazarus

Сообщение gorman » 04.08.2010 12:45:56

Как не регистрируется? Опишите ваши действия.

Добавлено спустя 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 Расскажите, как сделали?


Опишите как не регистрируется просто не компилируется или что-либо другое. Подробно опишите ваши действия.
gorman
незнакомец
 
Сообщения: 4
Зарегистрирован: 02.08.2010 16:31:07

Re: Проблема при создании демона(сервиса) в Lazarus

Сообщение Brainenjii » 04.08.2010 14:10:30

Файл -> Создать -> 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:
Код: Выделить всё
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 вводить администратора всё остаётся так же...
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Проблема при создании демона(сервиса) в Lazarus

Сообщение gorman » 04.08.2010 15:10:00

Запуск службы командой:

NameService -r

у меня тоже не работает. Выход из этого прост заходите в панель управления->администрирование->службы находите там свою службу (которая должна появиться после NameService -i) и устанавливаете тип запуска, запускаете ее и т.д.
Я попробовал запустить вашу программу в ней необходимо заменить имя пользователя с system на какое-либо другое (ну не нравится это винде! :D ). И желательно подправьте код:

unit DaemonUnit1;
...
Initialization {Замените begin}
RegisterDaemon;
End.

unit DaemonMapperUnit1;
...
Initialization {Замените begin}
RegisterMapper;
End.

Работать будет и с begin но так правильнее. Я все проверил работает. Если заработает у вас или нет в любом случае пишите.(самому интересно)
gorman
незнакомец
 
Сообщения: 4
Зарегистрирован: 02.08.2010 16:31:07

Re: Проблема при создании демона(сервиса) в Lazarus

Сообщение Brainenjii » 04.08.2010 15:33:57

Не поменялось... Пробовал и доменного админа вписывать в WinBindings, и даже локального создал с логином и паролем в латинице (вдруг там с кодировкой проблемы) - и все-равно, OS Code 1057...

P.S. вот он, этот коварный демон
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Проблема при создании демона(сервиса) в Lazarus

Сообщение Nik » 01.05.2011 18:33:09

Столкнулся с похожей проблемой. Пытаюсь навоять службу (пока только для Win), Разобрал пример из Lazarus (lazarusexamplescleandircleandir.lpr). По образу и подобию навоял свой "демон". Он без проблем регистрируется в системе и даже запускается. Но вот код, прописанный на Daemon.OnStart (и на любые другие события - тоже) не выполняется. Ни строчки.
Прочитал мануал с freepascal.ru и из wiki - вроде всё правильно сделано.

Где там может быть косяк? Или это Lazarus/Win7 тупять?

Добавлено спустя 2 часа 13 минут 53 секунды:
Тупо переписал с нуля, уже без примеров. Теперь работает. Только завершаться нормально не хочет. При попытке остановки службы Windows ругается - мол, не могу завершить, хотя служба об ошибках не сообщает.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Проблема при создании демона(сервиса) в Lazarus

Сообщение Mr.Smart » 01.05.2011 20:57:52

Необходимо отрабатывать событие Shutdown у службы и выходить из цикла repeat until закрывая сокет.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Проблема при создании демона(сервиса) в Lazarus

Сообщение Nik » 01.05.2011 22:09:40

Сделал так:

Код: Выделить всё
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; 


Не помогло. Всё равно вылетает с громким криком.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Проблема при создании демона(сервиса) в Lazarus

Сообщение Mr.Smart » 01.05.2011 22:34:27

Так вы используйте какой либо флаг при установке, которого необходимо завершить цикл с прослушкой сокета.
Код: Выделить всё
repeat
    if ListenerSocket.canread(1000) then
....

а вообще дам вам совет: перенесите код прослушки сокета в отдельный поток!
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Проблема при создании демона(сервиса) в Lazarus

Сообщение Nik » 02.05.2011 11:26:01

Mr.Smart писал(а):Так вы используйте какой либо флаг при установке, которого необходимо завершить цикл с прослушкой сокета.
Код: Выделить всё
repeat
    if ListenerSocket.canread(1000) then
....


Так я так и делю - NeedToExit как раз такой флаг и есть. Если он true - цикл прерываться должен.

Собственно, эксперименты показали, что ShutDown и Stop для Daemon'а вообще не вызываются. Пробовал в этих событиях писать в лог сообщения - лог пустой. Похоже, Windows прибивает демон в обход нормальной процедуры его завершения.
Так что непонятно, как вообще установить флаг выхода.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Проблема при создании демона(сервиса) в Lazarus

Сообщение Nik » 04.05.2011 16:38:50

2Mr.Smart
После переноса цикла repeat в отдельный поток служба стала корректно останавливаться. Спасибо за наводку :)
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Проблема при создании демона(сервиса) в Lazarus

Сообщение gvido » 25.04.2014 13:49:49

Приветствую всех. Подскажите куда делся мастер создания проекта сервиса(daemon) и как его вернуть?
вопрос снимаетя - нашел. :)
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21

Рейтинг@Mail.ru