Daemons and Services/es: what changed
Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.
| Old | New | Line | |
|---|---|---|---|
| 1 | 1 | # ¿Qué son demonios, servicios y agentes? | |
| 2 | 2 | ||
| 3 | 3 | 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. | |
| 4 | 4 | ||
| 5 | 5 | 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'. | |
| 6 | 6 | ||
| 7 | 7 | # Instalación de LazDaemon | |
| 8 | 8 | ||
| 9 | 9 | 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. | |
| 10 | 10 | ||
| 11 | 11 | Este paquete instala algunos componentes nuevos y un menú de elementos en el IDE. | |
| 12 | 12 | ||
| 13 | - | ||
| 13 | + |  | |
| 14 | 14 | ||
| 15 | 15 | # Classes | |
| 16 | 16 | ||
| 17 | 17 | ## TCustomDaemon | |
| 18 | 18 | ||
| 19 | 19 | 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)). | |
| 20 | 20 | ||
| 21 | 21 | ## TCustomDaemonApplication | |
| 22 | 22 | ||
| 23 | 23 | 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). | |
| 24 | 24 | ||
| 25 | 25 | ## TDaemonMapper | |
| 26 | 26 | ||
| 27 | 27 | Este componente maneja el registro de servicio. Cada instancia necesita una entrada en la propiedad **DaemonDefs**. | |
| 28 | 28 | ||
| 29 | 29 | # Demonios - Paso a Paso | |
| 30 | 30 | ||
| 31 | 31 | - Cuando el demonio arranca se analizan sintácticamente los parámetros de la línea de mandatos. Los siguientes están predefinidos: | |
| 32 | 32 | - -i --install: registra el demonio. No tiene efecto bajo unix. | |
| 33 | 33 | - -u --uninstall: elimina el registro del demonio. No tiene efecto bajo unix. | |
| 34 | 34 | - -r --run: arranca el demonio (daemon). Windows realiza esto normalmente por si mismo. | |
| 35 | 35 | - Crear el TDaemonMapper | |
| 36 | 36 | - Crear un TCustomDaemon por cada entrada de *DaemonDefs*. | |
| 37 | 37 | - instala(install), uninstall(desinstala) o arranca cada instancia. | |
| 38 | 38 | - if run: arranca cada instancia en cada propia hebra (hilo o thread) y espera la señal de Stop(Windows) o Term (Linux/Unix). | |
| 39 | 39 | ||
| 40 | 40 | # Métodos del demonio | |
| 41 | 41 | ||
| 42 | 42 | - **Start:** Llamado para arrancar (start) el demonio. Este método debe retornar inmediatamente *True*. | |
| 43 | 43 | ||
| 44 | 44 | - **Stop:** LLamado para detener (stop) el demonio. Este método debe retornar inmediatamente *True*. | |
| 45 | 45 | ||
| 46 | 46 | - **Shutdown:** Llamado para matar (kill) el demonio. Este método debe parar el demonio inmediatamente y retornar inmediatamente *True*. | |
| 47 | 47 | ||
| 48 | 48 | No se dispara bajo Linux. Linux simplemente mata el demonio. | |
| 49 | 49 | ||
| 50 | 50 | - **Pause:** Llamado para pausar el demonio. Este método debe retornar inmediatamente *True*. | |
| 51 | 51 | ||
| 52 | 52 | No se dispara bajo Linux porque el núcleo (kernel) detiene completamente el demonio en STOP y lo continúa con CONT. | |
| 53 | 53 | ||
| 54 | 54 | - **Continue:** Llamado cuando el demonio debe continuar tras una pausa. Este método debe retornar inmediatamente *True*. | |
| 55 | 55 | ||
| 56 | 56 | No se dispara bajo Linux. | |
| 57 | 57 | ||
| 58 | 58 | - **Install:** Llamado cuando se registra un demonio como servicio de Windows. Este método debe retornar*True* si el registro es completado correctamente. | |
| 59 | 59 | ||
| 60 | 60 | - **Uninstall:** Llamado cuando un demonio es eliminado del registro como servicio de Wndows. Este método debe retorna *True* si la eliminación del | |
| 61 | 61 | ||
| 62 | 62 | registro se completa correctamente. | |
| 63 | 63 | ||
| 64 | 64 | - **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. | |
| 65 | 65 | ||
| 66 | 66 | - **HandleCustomCode:** Llamado cuando se envía una señal especial al demonio. Este método retorna *True* si el resultado es satisfactorio. | |
| 67 | 67 | ||
| 68 | 68 | ## Aclaraciones antes de comenzar | |
| 69 | 69 | ||
| 70 | 70 | 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. | |
| 71 | 71 | ||
| 72 | 72 | # Ejemplo | |
| 73 | 73 | ||
| 74 | 74 | 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í. | |
| 75 | 75 | ||
| 76 | 76 | # Service Installation | |
| 77 | 77 | ||
| 78 | 78 | ## Windows | |
| 79 | 79 | ||
| 80 | 80 | 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. | |
| 81 | 81 | ||
| 82 | 82 | Ver también: [[ServiceManager]] | |
| 83 | 83 | ||
| 84 | 84 | ## Linux (Debian en sus versiones antiguas y Devuan) | |
| 85 | 85 | ||
| 86 | 86 | Descarga. configura y "Salva como" - el script de ejemplo en [Script de Servicios](http://aurawin.com/lazarus/debian-service.sh). | |
| 87 | 87 | ||
| 88 | 88 | - SVC_ALIAS es la descripción larga de la aplicación. | |
| 89 | 89 | - SVC_FILENAME es el nombre actual de fichero de la aplicación de servicio compilada. | |
| 90 | 90 | - SVC_DIR es la ubicación de la aplicación de servicio que utilicemos. | |
| 91 | 91 | - SVC_SERVICE_SCRIPT es el nombre final de service.sh cuando se "Salva como" del script personalizado de debian-service.sh. | |
| 92 | 92 | ||
| 93 | 93 | Sitúa tu propio script en la carpeta /etc/init.d/ | |
| 94 | 94 | ||
| 95 | 95 | Comienza el servicio ejecutando "sudo service trayectoria_completa_y_nombre_de_fichero start" | |
| 96 | 96 | ||
| 97 | 97 | 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. | |
| 98 | 98 | ||
| 99 | 99 | Opción 1: | |
| 100 | 100 | ||
| 101 | 101 | ``` pascal | |
| 102 | 102 | sudo update-rc.d Nombre_de_tu_Script defaults | |
| 103 | 103 | ``` | |
| 104 | 104 | ||
| 105 | 105 | Opción 2: | |
| 106 | 106 | ||
| 107 | 107 | ``` pascal | |
| 108 | 108 | sudo apt-get install chkconfig | |
| 109 | 109 | sudo chkconfig --add Nombre_de_tu_Script | |
| 110 | 110 | sudo chkconfig --level 2345 Nombre_de_tu_Script on | |
| 111 | 111 | ``` | |
| 112 | 112 | ||
| 113 | 113 | ## Linux | |
| 114 | 114 | ||
| 115 | 115 | 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. | |
| 116 | 116 | ||
| 117 | 117 | En versiones recientes de Fedora utiliza [systemd](https://es.wikipedia.org/wiki/Systemd) con start/stop services que son los mismos que utiliza Debian. | |
| 118 | 118 | ||
| 119 | 119 | - Desde el prompt de la línea de mandatos ejecutar **sudo gedit** o cualquier otro editor simple disponible. | |
| 120 | 120 | - Copia y pega lo siguiente: | |
| 121 | 121 | ||
| 122 | 122 | ``` ini | |
| 123 | 123 | [Unit] | |
| 124 | 124 | Description=Descripción larga de la aplicación | |
| 125 | 125 | After=network.target | |
| 126 | 126 | ||
| 127 | 127 | [Service] | |
| 128 | 128 | Type=simple | |
| 129 | 129 | ExecStart=trayecto_completo_y_nombre_de_fichero -r | |
| 130 | 130 | RemainAfterExit=yes | |
| 131 | 131 | TimeoutSec=25 | |
| 132 | 132 | ||
| 133 | 133 | [Install] | |
| 134 | 134 | WantedBy=multi-user.target | |
| 135 | 135 | ``` | |
| 136 | 136 | ||
| 137 | 137 | - Edita los siguiente valores. | |
| 138 | 138 | - Descripción - Descripción larga de los servicios de la aplicación. | |
| 139 | 139 | - ExecStart - trayecto_completo_y_nombre_de_fichero es el nombre de la aplicación de servicios compilada con su trayecto completo. | |
| 140 | 140 | ||
| 141 | 141 | - Salvar como diálogo | |
| 142 | 142 | - Navegar hasta /lib/systemd/system/ | |
| 143 | 143 | - Nombrar el fichero igual que nombre_del_servicio.service | |
| 144 | 144 | ||
| 145 | 145 | Hay un ejemplo de configuración de systemd en [Service](http://aurawin.com/lazarus/fedora.service) | |
| 146 | 146 | ||
| 147 | 147 | ## Software de ejemplo | |
| 148 | 148 | ||
| 149 | 149 | Listado de software práctico que nos permite examinar su código: | |
| 150 | 150 | ||
| 151 | 151 | - **LazWinServiceMgr:** <https://sourceforge.net/projects/lazwinservicemgr/?source=directory> | |
| 152 | 152 | - **LazProcessKiller:** <https://sourceforge.net/projects/lazprocesskiller/> | |
| 153 | 153 | ||
| 154 | 154 | # Ver también | |
| 155 | 155 | ||
| 156 | 156 | - [[ServiceManager]] Ejemplo de unidad FreePascal para gestión se servicios Windows. | |
| 157 | 157 | - [[Office Automation]] | |
| 158 | 158 | - [Taming the daemon: PDF by Michaël Van Canneyt](http://www.turbog.com/wp-content/uploads/2012/04/daemons.pdf): Resultaría interesante conseguir el permiso del autor para traducir este documento al español. | |
| 159 | 159 | - [Useful discussion with small working daemon application](http://forum.lazarus.freepascal.org/index.php/topic,22983.msg152303.html#msg152303) | |
| 160 | 160 | ||
| 161 | 161 | --- | |
| 162 | 162 | *From the Free Pascal wiki, page "Daemons and Services/es", as it stood on 2022-01-09 after a change by Slawek, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* |
