Daemons and Services/es
¿Qué son demonios, servicios y agentes?
Las diferentes denominaciones varían segun el sistema operativo, recibiendo el nombre de demoniosdaemons en sistemas Unix, servicios servicesen sistemas Windows y agentes agents para Mac OS X. El concepto es que son programas que se ejecutan sin interacción del usuario, incluso sin que este se valide. Aunque su nomenclatura difiere su función viene a ser similar: por ejemplo, los servidores www o ftp se llaman demonios bajo Linux y servicios bajo Windows. Debido a que no interactúan con el usuario directamente cierran sus descriptores stdin (entrada estandar), su stdout (salida estandar) y stderr (estandar error) a su inicio.
Con FreePascal/Lazarus se pueden escribir estos demonios/servicios que son independientes de la plataforma mediante el uso del paquete lazdaemon. Para evitar conflictos de nombres con los componentes de Delphi estas clases se han denominado 'daemons'.
Instalación de LazDaemon
Antes de comenzar a gestionarlos dentro de Lazarus es necesario instalar el paquete LazDaemon. Bien sea vía Componentes/Configurar paquetes instalados o bien abriendo/instalando el fichero .lpk directamente que se encuentra en la ubicación: lazarus/components/daemon/lazdaemon.lpk.
Este paquete instala algunos componentes nuevos y un menú de elementos en el IDE.
Classes
TCustomDaemon
TCustomDaemon es un descendiente de TDataModule que realiza todo el trabajo. Puede haber varias clases TCustomDaemons classes y/o instancias corriendo al mismo tiempo y en el el mismo proceso (multi ebra o hilo (threaded)).
TCustomDaemonApplication
TCustomDaemonApplication es un descendiente de TCustomApplication que crea TCustomDaemons. No necesita cambios. Corre bajo Windows hasta que recibe la llamada de Stopo bajo Linux hasta que recibe la señal TERM (Term Signal).
TDaemonMapper
Este componente maneja el registro de servicio. Cada instancia necesita una entrada en la propiedad DaemonDefs.
Demonios - Paso a Paso
- Cuando el demonio arranca se analizan sintácticamente los parámetros de la línea de mandatos. Los siguientes están predefinidos:
- -i --install: registra el demonio. No tiene efecto bajo unix.
- -u --uninstall: elimina el registro del demonio. No tiene efecto bajo unix.
- -r --run: arranca el demonio (daemon). Windows realiza esto normalmente por si mismo.
- Crear el TDaemonMapper
- Crear un TCustomDaemon por cada entrada de DaemonDefs.
- instala(install), uninstall(desinstala) o arranca cada instancia.
- if run: arranca cada instancia en cada propia hebra (hilo o thread) y espera la señal de Stop(Windows) o Term (Linux/Unix).
Métodos del demonio
Start
Llamado para arrancar (start) el demonio. Este método debe retornar inmediatamente True.
Stop
LLamado para detener (stop) el demonio. Este método debe retornar inmediatamente True.
Shutdown
Llamado para matar (kill) el demonio. Este método debe parar el demonio inmediatamente y retornar inmediatamente True. No se dispara bajo Linux. Linux simplemente mata el demonio.
Pause
Llamado para pausar el demonio. Este método debe retornar inmediatamente True. No se dispara bajo Linux porque el núcleo (kernel) detiene completamente el demonio en STOP y lo continúa con CONT.
Continue
Llamado cuando el demonio debe continuar tras una pausa. Este método debe retornar inmediatamente True. No se dispara bajo Linux.
Install
Llamado cuando se registra un demonio como servicio de Windows. Este método debe retornarTrue si el registro es completado correctamente.
Uninstall
Llamado cuando un demonio es eliminado del registro como servicio de Wndows. Este método debe retorna True si la eliminación del registro se completa correctamente.
AfterUnInstall
Llamado despues de que el demonio es quitado del registro como servicio de Windows. Este método debe retornar True si dicha llamada es satisfactoria.
HandleCustomCode
Llamada cuando se envía una señal especial al demonio. Este método retorna True si el resultado es satisfactorio.
Aclaraciones antes de comenzar
Antes de que puedas crear una aplicación en la modalidad de Servicio o Demonio es preciso asegurarse de que el paquete "lazdaemon" de encuentra instalado en Lazarus.