Программа типа демон

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Программа типа демон

Сообщение Vadim » 05.09.2008 10:55:32

Подскажите такую штуку. Вот в памяти компа (FreeBSD 6.0) должна постоянно висеть программа и периодически, раз в 15 секунд, делать не особо сложную задачу (сейчас это запрашивать состояние траффика у IPFW, ipfw show №_правила_count, парсить полученную строку и заносить результат в БД. Потьом будут ещё парочка подобных задач).
Так вот, меня интересует принцип висения в памяти, слежения за временем или за таймером, но чтобы было несложно. Тут нужен класс TDaemon или есть ещё какие варианты?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Программа типа демон

Сообщение Сергей Смирнов » 05.09.2008 15:02:14

В принципе, TDaemon (или как его там звать) как раз и служит искомой цели, но у меня с ним были какие-то проблемы, поэтому я просто писал программу в соответствии с некими принципами демоностроения, которые в TDaemon тоже реализованы. Основная идея демона заключается в том, что основной процесс нужно поскорее форкнуть и завершить. Собственно работать программа будет после этого именно в форке. Дальше надо научиться реагировать на сигналы, чтобы демон можно было корректно завершить, а не просто "срубить" процесс. Если полазить по инету и по коду TDaemon, то со всем этим несложно разобраться.
По крайней мере в линуксе это работает так, не думаю, что во FreeBSD оно сильно отличается.
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Re: Программа типа демон

Сообщение Attid » 05.09.2008 17:01:39

обсуждалось это и есть линка в факе.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: Программа типа демон

Сообщение Vadim » 05.09.2008 18:11:18

Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Программа типа демон

Сообщение Brainenjii » 05.09.2008 20:13:52

http://www.delphimaster.ru/articles/kylix3/index.html - я вот такую статью видел ^_^ Правда не пробовал...
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Программа типа демон

Сообщение Vadim » 06.09.2008 05:44:47

Brainenjii
Спасибо. :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Программа типа демон

Сообщение Logo » 07.09.2008 03:26:43

Если Вы имеете fpcbuild то в fpcbuild/demo/unix/daemon.pp лежит работающий пример.

Добавлено спустя 6 минут 56 секунд:
Хотел присоединить файл, так жалуется на расширение, причем на любое. Что я не так делаю???

Добавлено спустя 8 минут 11 секунд:
Код: Выделить всё
{---------------------------------------------------------------------------
                                 CncWare
                           (c) Copyright 2000
---------------------------------------------------------------------------
  Filename..: daemon.pp
  Programmer: Ken J. Wright
  Date......: 03/21/2000

  Purpose - Program to demonstrate construction of a Linux daemon.

  Usage:
    1) Compile this program.
    2) Run it. You will be immediately returned to a command prompt.
    3) Issue the command: ps ax|grep daemon. This will show you the process
       id of the program "daemon" that you just ran.
    4) Issue the command: tail -f daemon.log. This let's you watch the log file
       being filled with the message in the code below. Press Ctrl/c to break
       out of the tail command.
    5) Issue the command: kill -HUP pid. pid is the process number you saw with
       the ps command above. You will see that a new log file has been created.
    6) Issue the command: kill -TERM pid. This will stop the daemon. Issuing the
       ps command above, you will see that the daemon is no longer running.

-------------------------------<< REVISIONS >>--------------------------------
  Ver  |    Date    | Prog | Decription
-------+------------+------+--------------------------------------------------
  1.00 | 03/21/2000 | kjw  | Initial release.
  1.01 | 03/21/2000 | kjw  | Forgot to close input, output, & stderr.
------------------------------------------------------------------------------
}
Program Daemon;
uses SysUtils,BaseUnix;
Var
   { vars for daemonizing }
   bHup,
   bTerm : boolean;
   fLog : text;
   logname : string;
   aOld,
   aTerm,
   aHup : pSigActionRec;
   ps1  : psigset;
   sSet : cardinal;
   pid  : pid_t;
   secs : longint;
   zerosigs : sigset_t;
   hr,mn,sc,sc100 : word;

{ handle SIGHUP & SIGTERM }
procedure DoSig(sig : longint);cdecl;
begin
   case sig of
      SIGHUP : bHup := true;
      SIGTERM : bTerm := true;
   end;
end;

{ open the log file }
Procedure NewLog;
Begin
   Assign(fLog,logname);
   Rewrite(fLog);
   Writeln(flog,'Log created at ',formatdatetime('hh:nn:ss',now));
   Close(fLog);
End;

Begin
   logname := 'daemon.log';
   secs := 10;
   fpsigemptyset(zerosigs);

   { set global daemon booleans }
   bHup := true; { to open log file }
   bTerm := false;

   { block all signals except -HUP & -TERM }
   sSet := $ffffbffe;
   ps1 := @sSet;
   fpsigprocmask(sig_block,ps1,nil);

   { setup the signal handlers }
   new(aOld);
   new(aHup);
   new(aTerm);
   aTerm^.sa_handler{.sh} := SigactionHandler(@DoSig);

   aTerm^.sa_mask := zerosigs;
   aTerm^.sa_flags := 0;
   {$ifndef BSD}                {Linux'ism}
    aTerm^.sa_restorer := nil;
   {$endif}
   aHup^.sa_handler := SigactionHandler(@DoSig);
   aHup^.sa_mask := zerosigs;
   aHup^.sa_flags := 0;
   {$ifndef BSD}                {Linux'ism}
    aHup^.sa_restorer := nil;
   {$endif}
   fpSigAction(SIGTERM,aTerm,aOld);
   fpSigAction(SIGHUP,aHup,aOld);

   { daemonize }
   pid := fpFork;
   Case pid of
      0 : Begin { we are in the child }
         Close(input);  { close standard in }
         Close(output); { close standard out }
         Assign(output,'/dev/null');
         ReWrite(output);
         Close(stderr); { close standard error }
         Assign(stderr,'/dev/null');
         ReWrite(stderr);
      End;
      -1 : secs := 0;     { forking error, so run as non-daemon }
      Else Halt;          { successful fork, so parent dies }
   End;

   { begin processing loop }
   Repeat
      If bHup Then Begin
         {$I-}
         Close(fLog);
         {$I+}
         IOResult;
         NewLog;
         bHup := false;
      End;
      {----------------------}
      { Do your daemon stuff }
      Append(flog);
      Writeln(flog,'daemon code activated at ',formatdatetime('hh:nn:ss',now));
      Close(fLog);
      { the following output goes to the bit bucket }
      Writeln('daemon code activated at ',hr:0,':',mn:0,':',sc:0);
      {----------------------}
      If bTerm Then
         BREAK
      Else
         { wait a while }
         fpSelect(0,nil,nil,nil,secs*1000);
   Until bTerm;
End.

Logo
постоялец
 
Сообщения: 464
Зарегистрирован: 20.08.2008 01:00:47

Re: Программа типа демон

Сообщение Vadim » 07.09.2008 06:09:37

Logo
Спасибо большое! Врт как раз fpcbuild у меня и нету. :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Программа типа демон

Сообщение Attid » 07.09.2008 11:36:50

Vadim писал(а):В факе по FPC???

хм, оказалось что в факе по лазарю viewtopic.php?f=5&t=60, но пусть уже лежит там =)
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2586
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru