Daemons and Services/es
│
English (en) │
español (es) │
français (fr) │
polski (pl) │
português (pt) │
русский (ru) │
¿Qué son demonios, servicios y agentes?
Las diferentes denominaciones varían segun el sistema operativo, recibiendo el nombre de demonios (daemons) en sistemas Unix, servicios (services) en sistemas Windows y agentes (agents) para macOS. 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 hebra 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 Stop o 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: Llamado 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.
Ejemplo
Puedes encontrar un ejemplo simple de todo esto en el directorio examples/cleandir/ de la instalación de Lazarus. Lee el fichero README.txt que se encuentra allí.
Service Installation
Windows
Un servicio se instala ejecutando el proceso con el parámetro install. A continuación Windows Services Manager realizará el resto. A través del Service Manager se puede configurar tanto el servicio como sus opciones.
Ver también: ServiceManager
Linux (Debian en sus versiones antiguas y Devuan)
Descarga. configura y "Salva como" - el script de ejemplo en Script de Servicios.
- SVC_ALIAS es la descripción larga de la aplicación.
- SVC_FILENAME es el nombre actual de fichero de la aplicación de servicio compilada.
- SVC_DIR es la ubicación de la aplicación de servicio que utilicemos.
- SVC_SERVICE_SCRIPT es el nombre final de service.sh cuando se "Salva como" del script personalizado de debian-service.sh.
Sitúa tu propio script en la carpeta /etc/init.d/
Comienza el servicio ejecutando "sudo service trayectoria_completa_y_nombre_de_fichero start"
Para que se auto ejecute el servicio al iniciar el sistema puedes probar a ubicarlo en update-rc.d o de otro modo puede que necesites una utilidad de terceros para lograrlo.
Opción 1:
sudo update-rc.d Nombre_de_tu_Script defaults
Opción 2:
sudo apt-get install chkconfig
sudo chkconfig --add Nombre_de_tu_Script
sudo chkconfig --level 2345 Nombre_de_tu_Script on
Linux
Actualmente, las diversas distribuciones de Linux (como Fedora, Debian, SLES12) están tendiendo a abandonar la diversidad de formas de lanzar los demonios, tratando de utilizar un modelo unificado de servicios. Otras (como Devuan y sus derivados) sin embargo defienden la libertad de escoger entre el sistema clásico o el moderno systemd, por tanto hay variedad para los diferentes gustos.
En versiones recientes de Fedora utiliza systemd con start/stop services que son los mismos que utiliza Debian.
- Desde el prompt de la línea de mandatos ejecutar sudo gedit o cualquier otro editor simple disponible.
- Copia y pega lo siguiente:
[Unit]
Description=Descripción larga de la aplicación
After=network.target
[Service]
Type=simple
ExecStart=trayecto_completo_y_nombre_de_fichero -r
RemainAfterExit=yes
TimeoutSec=25
[Install]
WantedBy=multi-user.target
- Edita los siguiente valores.
- Descripción - Descripción larga de los servicios de la aplicación.
- ExecStart - trayecto_completo_y_nombre_de_fichero es el nombre de la aplicación de servicios compilada con su trayecto completo.
- Salvar como diálogo
- Navegar hasta /lib/systemd/system/
- Nombrar el fichero igual que nombre_del_servicio.service
Hay un ejemplo de configuración de systemd en Service
Software de ejemplo
Listado de software práctico que nos permite examinar su código:
- LazWinServiceMgr: https://sourceforge.net/projects/lazwinservicemgr/?source=directory
- LazProcessKiller: https://sourceforge.net/projects/lazprocesskiller/
Ver también
- ServiceManager Ejemplo de unidad FreePascal para gestión se servicios Windows.
- Office Automation
- Taming the daemon: PDF by Michaël Van Canneyt: Resultaría interesante conseguir el permiso del autor para traducir este documento al español.
- Useful discussion with small working daemon application