You don't have access to this class

Keep learning! Join and start boosting your career

Aprovecha el precio especial y haz tu profesión a prueba de IA

Antes: $249

Currency
$209
Suscríbete

Termina en:

0 Días
12 Hrs
14 Min
57 Seg

Creación y manejo de demonios

28/30
Resources

Daemon management in Linux is a fundamental skill for any system administrator. These background processes allow our operating system to run efficiently, executing critical tasks without direct user intervention. Mastering daemon creation and management will give you deeper control over your Linux system, allowing you to automate tasks and create custom services that run according to your specific needs.

What are daemons in Linux and what are they for?

Daemons are a mechanism that Linux has to give service behavior to processes. This means that we can configure them to start automatically when the system boots, under specific conditions and with predetermined behaviors.

These services are created through configuration files called "Unit Files", which define how and when a daemon should be executed. A common use case is when we need a script (for example, in Python) to run constantly performing a specific function without manual intervention.

The first and most important daemon in Linux is SystemD, which functions as the main manager for all other system daemons. SystemD is responsible for starting critical components such as:

  • Network drivers
  • Graphical environment
  • Essential operating system services

To interact with SystemD, we use SystemCTL (System Control), which provides an interface to manage system daemons and services.

How to create and configure a custom daemon?

To demonstrate the process of creating a daemon, let's implement a simple Python script that works as a basic logger, recording the current date every second in a file.

Preparing the script

First, we need to create our Python script:

import timefrom datetime import datetime
while True: file = open('/date_logs/timestamp.txt', 'a') file.write(f "Timestamp: {datetime.now()}") file.close() time.sleep(1)

This script simply:

  1. Opens a file in append mode.
  2. Writes the current date and time
  3. Closes the file
  4. Wait a second before repeating the process

Setting up the environment

For our script to work correctly, we must:

  1. Verify that Python is installed:
python3 -V
  1. Create the directory where the logs will be saved:
mkdir /date_logs
  1. Create a directory for our scripts:
mkdir /root/scripts
  1. Save our script in the appropriate location:
vim /root/scripts/logger.py

Creating the Unit File

The Unit File is the configuration that SystemD will use to manage our daemon. We must create it in the correct location:

vim /etc/systemd/system/system/loggerPython.service.

And add the following content:

[Unit] Description=PythonLogger After=multi-user.target
[Service]Type=simpleRestart=always ExecStart=/usr/bin/python3/root/scripts/logger.py
[Install] WantedBy=multi-user.target

This configuration file has three main sections:

  1. [Unit]: Contains metadata and dependencies.

    • Description: A simple description of the service
    • After: Indicates that this service should be started after the specified target.
  2. [Service]: Defines the behavior of the service

    • Type: Specifies the type of process (simple, forking, oneshot, etc.)
    • Restart: Determines when to restart the service (always, on-failure, etc.)
    • ExecStart: The command to be executed to start the service.
  3. [Install]: Configures how the service is installed

    • WantedBy: Specifies in which target this service should be included.

Activating and managing the daemon

Once the Unit File is created, we must reload SystemD to recognize the changes:

systemctl reload

To enable the service to start automatically at system startup:

systemctl enable loggerPython.service

To manually start the service:

systemctl start loggerPython.service

To check the status of the service:

systemctl status loggerPython.service

To stop the service:

systemctl stop loggerPython.service

To disable automatic startup:

systemctl disable loggerPython.service

How do targets and runlevels work?

In SystemD, targets are similar to runlevels in traditional SysV init systems. The multi-user. target we use in our example is activated after all essential services (network, drivers, etc.) have been started, allowing access to a text console.

Targets define specific points in the boot process and determine which services should be active at each stage. This allows a more granular and flexible management of system services.

Mastering the creation and management of daemons in Linux will allow you to automate tasks, create custom services and have more control over your system. Have you created a custom daemon for a specific task? Share your experience in the comments and explore other possibilities to take advantage of this powerful Linux feature.

Contributions 20

Questions 2

Sort by:

Want to see more contributions, questions and answers from the community?

Creación y manejo de demonios

Es un proceso de Linux que da un comportamiento de servicio a un programa: es decir, que se ejecuta en segundo plano sin la interacción de un usuario.

  • systemd : crea los demonios
  • systemctl: gestiona los demonios

Para crear un demonio primero debes:

  • Crear el script o unit file que usará de base tu demonio, esto puedes hacerlo con Python u otro lenguaje de scripting.

  • Es importante crear el folder donde se alojará el unit file a nivel de root, de esta manera estará disponible para todos los usuarios.

  • Crear la carpeta en donde alojaremos la información generada por nuestro unit file.

  • ir a /etc/systemd/system y crear el script que beberá del primero para poder correr el demonio.

  • reiniciamos los demonios con:

     systemctl daemons-reload
    
  • Habilitamos con:

     systemctl enable loggerpython.service
    
  • Activamos con:

     systemctl start loggerpython.service
    

mi aporte en ruby guardandolo en un archivo llamado poem

class File
  def self.my_open(filename, mode)
    file = self.new(filename, mode)
    return file unless block_given?
    begin
      yield file
    rescue Exception => e
      p e.message
    ensure
      file.close
    end
  end
end

File.my_open("poem.txt", "w") do |f|
  f.puts "Hello world"
  while true
   sleep(1)
   f.puts Time.now
  end
end

Intento con bash

#!/bin/bash
#
# datetime logger
#
# Usage:
# - First make it executable by running chmod +x ./logger.sh
# - Then run it with ./logger.sh
#
# If run from the right location (/scripts) and with the right privileges (root) it shouldn't produce errors but you can always redirect the stderr to a file or to /dev/null if you need to.
# that would be ./logger.sh 2> error.log or ./logger.sh 2>/dev/null

while true; do
        echo "Timestamp: $(date '+%Y-%m-%d %H:%M:%S')" >> /datelogs/timestamp.txt
        sleep 1
done

Esto ya lo había hecho en la universidad :0 pero no sabía que se llamaban “unit files” solo les conocia como scripts de arranque

IMPLEMENTACIÓN DE UN ARCHIVO DE UNIDAD DE SERVICIO (DAEMON)
.
La implementación de un archivo de unidad de servicio en systemd implica seguir una sintaxis específica y definir varias opciones de configuración. Aquí hay un ejemplo básico de cómo sería la implementación de un archivo de unidad de servicio:
.

  1. Abre un editor de texto y crea un nuevo archivo con una extensión .service. Por ejemplo, puedes usar el comando sudo nano /etc/systemd/system/mi_servicio.service para crear y abrir el archivo con el editor de texto nano (asegúrate de tener privilegios de superusuario para realizar esta operación).
    .
  2. En el archivo, define las siguientes secciones y opciones de configuración:
[Unit]
Description=Descripción de mi servicio
After=network.target   # Dependencias, si es necesario

[Service]
ExecStart=/ruta/al/comando-de-inicio   # Comando para iniciar el servicio
ExecStop=/ruta/al/comando-de-detencion   # Comando para detener el servicio, si es necesario
Restart=always   # Opciones de reinicio, si es necesario
User=nombre_de_usuario   # Usuario bajo el cual se ejecuta el servicio
Group=nombre_de_grupo   # Grupo asociado al servicio
WorkingDirectory=/ruta/al/directorio/de/trabajo   # Directorio de trabajo del servicio, si es necesario

[Install]
WantedBy=multi-user.target   # Objetivo en el que se habilitará el servicio

Reemplaza /ruta/al/comando-de-inicio con la ruta absoluta del comando que se utilizará para iniciar el servicio. Puede ser un script, un binario o cualquier otro comando necesario para iniciar tu servicio.
.
Opcionalmente, reemplaza /ruta/al/comando-de-detencion con la ruta absoluta del comando que se utilizará para detener el servicio, si es necesario. Si no se especifica, systemd intentará detener el servicio enviando una señal SIGTERM al proceso principal.
.
Opcionalmente, ajusta las otras opciones de configuración según las necesidades de tu servicio.
.
Guarda y cierra el archivo.
.
Ejecuta el comando sudo systemctl daemon-reload para que systemd reconozca el nuevo archivo de unidad de servicio.
.
Para iniciar el servicio, usa el comando sudo systemctl start mi_servicio (reemplaza mi_servicio con el nombre del archivo de unidad de servicio sin la extensión .service).
.
Para detener el servicio, usa el comando sudo systemctl stop mi_servicio.

Para habilitar que el servicio se inicie automáticamente en el arranque del sistema, usa el comando sudo systemctl enable mi_servicio.
.
Con estos pasos, has implementado un archivo de unidad de servicio básico en systemd. Recuerda que puedes ajustar y personalizar las opciones de configuración según las necesidades específicas de tu servicio.
.
Fuente:ChatGPT.

si dice que el directorio no existe pongan solo dos puntos a la ruta, recuerden que python aveces o dependiendo su configuracion siempre hace referencia desde el punto donde esta y no desde el /home

import time
from datetime import datetime


while True:
    with open("../datelogs/tiempoAhora.txt","a") as file:
        file.write("\ntiempo ahora: {}".format(datetime.now()))
        file.close()
    time.sleep(1)

Código transformado a TypeScript y con comentarios agregados

import * as fs from 'fs';
import * as path from 'path';
import { promisify } from 'util';

const sleep = promisify(setTimeout);

async function writeTimestamp(): Promise<void> {
  const filePath = '/datelogs/timestamp.txt';

  while (true) {
    // Open the file in append mode
    const fileHandle = await fs.promises.open(filePath, 'a');
    
    try {
      // Get the current timestamp
      const timestamp = new Date().toISOString();
      
      // Append the timestamp to the file
      await fileHandle.appendFile(`\nTimestamp: ${timestamp}`);
    } finally {
      // Close the file handle
      await fileHandle.close();
    }
    
    // Wait for 1 second
    await sleep(1000);
  }
}

writeTimestamp().catch(console.error);

* Automatización de Tareas del Sistema: Los demonios permiten automatizar tareas esenciales como la limpieza de archivos temporales la programación de copias de seguridad y la sincronización de datos lo que ayuda a mantener el sistema operativo funcionando de manera eficiente sin intervención manual constante * Gestión de Servicios Críticos: Demonios como `sshd` para acceso remoto y `httpd` para servidores web gestionan servicios críticos que deben estar siempre disponibles y operativos garantizando que los usuarios y aplicaciones puedan acceder a los recursos necesarios en todo momento * Monitoreo y Seguridad del Sistema: Demonios como `auditd` y `fail2ban` monitorizan el sistema en busca de actividades sospechosas y eventos de seguridad permitiendo la detección y respuesta a posibles amenazas de manera proactiva * Manejo de Comunicaciones y Redes: Demonios como `network-manager` y `dnsmasq` gestionan las configuraciones de red y las comunicaciones en el sistema facilitando la conectividad y la gestión de redes de manera eficiente * Gestión de Recursos del Sistema: Demonios como `cron` y `systemd` gestionan la programación de tareas y la inicialización de servicios del sistema ayudando a optimizar el uso de recursos y a mantener un rendimiento estable
Para la lectura de la cantidad de archivos generados por el script, se utiliza el wordcount --> wc - l (para que cuente cada linea que se va generando). Ademas, para detener el script se realiza con las teclas "CTRL" + Z.
Muy buena clase, tenia conocimiento del systemctl pero no de como crear demonios. Gracias Enrique.
**¿QUÉ SON LOS DEMONIOS?** * **Definición:** Los demonios son procesos que se ejecutan en segundo plano, proporcionando servicios. * **Funcionalidad:** Permiten que scripts o aplicaciones se ejecuten de manera continua. * **Ejemplo:** Un script en Python que registre la fecha y hora en un archivo cada segundo. **CREACIÓN DE DEMONIOS: UNIT FILES** Para crear y gestionar demonios, utilizamos archivos llamados unit files. En esta clase, aprenderemos a crear, editar y entender la utilidad de estos archivos directamente desde la terminal. **SYSTEMD Y SYSTEMCTL** * **Systemd:** Es el primer demonio que se ejecuta en Linux y se encarga de iniciar y gestionar otros servicios del sistema. * **Systemctl:** Es la herramienta que utilizamos para controlar systemd. Nos permite iniciar, detener y verificar el estado de los demonios. **GESTIÓN DEL DEMONIO CON SYSTEMCTL** 1\. Recargar Systemd: systemctl daemon-reload 2\. Verificar el Estado del Servicio: systemctl status loggerpython.service 3\. Iniciar el Servicio: systemctl start loggerpython.service 4\. Habilitar el Servicio en el Inicio del Sistema: systemctl enable loggerpython.service 5\. Detener el Servicio: systemctl stop loggerpython.service 6\. Deshabilitar el Servicio: systemctl disable loggerpython.service **VERIFICACIÓN DEL FUNCIONAMIENTO** * Consultar el Log: cat /root/datelogs/timestamp.txt * Contar Líneas del Log: wc -l /root/datelogs/timestamp.txt
Les adjunto mis apuntes en notion: <https://www.notion.so/Creaci-n-y-manejo-de-demonios-3e5425abeb6e46a1aabc894fef21e057?pvs=4>
Que bonito <3 ![](https://static.platzi.com/media/user_upload/image-85164a15-cc35-44ee-ac0e-fc2008cd39e0.jpg)
El manejo de systemctl es muy utilizado cuando creas tu servidor apache para utilizarlo con PHP, debes realizar esos pasos y es muy interesante. Les recomiendo instalar PHP en Linux y vean cada paso para validar esos procesos
En Linux, un “unit file” es un archivo de configuración utilizado por systemd, el sistema init y administrador de servicios. Estos archivos definen cómo systemd debe manejar un recurso del sistema12. Características de los unit files: Definen servicios: Los unit files más comunes son los que terminan en .service, que definen cómo iniciar, detener y administrar servicios. Ubicación: Se encuentran en /etc/systemd/system/ o /lib/systemd/system/ y pueden ser creados y editados por el usuario o proporcionados por paquetes instalados. Formato: Son archivos de texto que utilizan una sintaxis específica para definir la configuración del servicio o recurso. Tipos de unidades: Además de servicios, pueden definir otros tipos de recursos como dispositivos, puntos de montaje, trabajos cron, sockets y más. Ejemplo de un unit file para un servicio: \[Unit] Description=Mi Servicio Personalizado After=network.target \[Service] ExecStart=/usr/bin/mi\_servicio User=mi\_usuario Restart=on-failure \[Install] WantedBy=multi-user.target Este es un ejemplo básico de cómo se ve un unit file para un servicio. Define cuándo se debe iniciar el servicio (After), qué comando ejecutar (ExecStart), bajo qué usuario (User), y qué hacer si falla (Restart). También especifica que el servicio debe iniciarse con el nivel de ejecución multi-user.target2. Los unit files son fundamentales para el funcionamiento de systemd, ya que le permiten gestionar los servicios y otros recursos del sistema de manera eficiente y modular.
![](https://static.platzi.com/media/user_upload/image-69c676f1-b469-41e7-8332-c8d949487f3a.jpg)![](https://static.platzi.com/media/user_upload/image-4327920a-3c0a-4eb4-bc4c-9f588b10b520.jpg)

Vemos estado con:

<systemctl status loggerpython.service> 

Habilitamos con:

<systemctl enable loggerpython.service> 

Activamos con:

< systemctl start loggerpython.service> 

Detenemos con

< systemctl stop loggerpython.service> 

Desahabilitamos con

< systemctl disable loggerpython.service> 

Estoy impresionado con lo que pueden hacer los demonios y como son creados a ser ejecutados sin ningun problema. Aprendi mucho de crearlos y manejarlos. Esta fue una gra clase que no olvidare. A seguir

UNIT FILES


Los “unit files” son archivos de configuración utilizados por systemd, el administrador de sistema y servicios en los sistemas operativos Linux. Estos archivos definen cómo systemd administra y controla varios servicios del sistema, objetivos, dispositivos, sockets y otras unidades. Por lo general, se almacenan en el directorio /etc/systemd/system/ o en directorios dentro de /lib/systemd/system/.
_
Existen varios tipos de archivos de unidades, cada uno con un propósito específico:

Archivos de unidad de servicio (*.service): Estos archivos definen servicios del sistema, que son procesos en ejecución continua. Especifican los comandos para iniciar, detener y administrar el servicio. Las unidades de servicio también pueden definir dependencias con otras unidades.
_
Archivos de unidad de objetivo (*.target): Las unidades de objetivo representan grupos de servicios que deben iniciarse o detenerse juntos. Actúan como puntos de sincronización para iniciar o detener varios servicios simultáneamente.
_
Archivos de unidad de socket (*.socket): Las unidades de socket definen sockets de comunicación entre procesos (IPC). Especifican el tipo de socket, la dirección de escucha y otros parámetros.
_
Archivos de unidad de dispositivo (*.device): Las unidades de dispositivo representan dispositivos del kernel, como dispositivos de hardware o dispositivos virtuales. Permiten que systemd administre operaciones específicas del dispositivo, como la creación de nodos de dispositivo o la carga de módulos.
_
Archivos de unidad de montaje (*.mount): Las unidades de montaje controlan el montaje y desmontaje de sistemas de archivos. Especifican el punto de montaje, el tipo de sistema de archivos y las opciones.
_
Archivos de unidad de temporizador (*.timer): Las unidades de temporizador definen temporizadores que activan la ejecución de otras unidades en intervalos específicos o en momentos específicos.

Estos son algunos de los tipos de archivos de unidad comúnmente utilizados en systemd. Cada archivo de unidad sigue una sintaxis específica e incluye varias opciones de configuración específicas de su tipo. Al crear o modificar estos archivos de unidad, los administradores del sistema pueden controlar cómo systemd administra e inicia varios componentes del sistema.

Fuente: ChatGPT.