Control de servicios systemd y escritura de archivos unit
Administre servicios con systemctl y cree archivos unit y de temporizador personalizados para demonios basados en scripts.
Control de servicios systemd y escritura de archivos unit es una lección gratuita de DevOps Bootcamp en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de DevOps Bootcamp, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de DevOps Bootcamp incluye 4 lecciones en total.
Introducción a systemd y systemctl
systemd es el sistema de inicio y el gestor de servicios que utilizan la mayoría de las distribuciones modernas de Linux. Se encarga de iniciar, detener y gestionar los servicios del sistema, así como de administrar las secuencias de arranque y el estado del sistema.
La herramienta principal para interactuar con systemd es systemctl. Con ella puede:
- Iniciar y detener servicios
- Activar o desactivar servicios durante el arranque
- Consultar el estado y los registros de los servicios
- Recargar la configuración sin reiniciar
Todos los servicios gestionados por systemd se definen mediante archivos de unidad, que son archivos de configuración declarativos almacenados en /etc/systemd/system/ (para todo el sistema) o ~/.config/systemd/user/ (por usuario).
Comandos esenciales de systemctl
Estos son los comandos de systemctl más utilizados para la gestión diaria de servicios. Cada comando opera sobre un nombre de unidad, como nginx.service o simplemente nginx.
systemctl start <unit>— iniciar un servicio inmediatamentesystemctl stop <unit>— detener un servicio en ejecuciónsystemctl restart <unit>— detener y volver a iniciar (reinicio completo)systemctl reload <unit>— enviar SIGHUP para volver a cargar la configuración sin detener el serviciosystemctl enable <unit>— crear enlaces simbólicos para que la unidad se inicie durante el arranquesystemctl disable <unit>— eliminar esos enlaces simbólicossystemctl status <unit>— mostrar el estado, el PID y las líneas de registro recientes
#!/usr/bin/env bash
# Quick reference: inspect and control an nginx service
# (Requires nginx to be installed; run as root or with sudo)
systemctl status nginx
systemctl start nginx
systemctl enable nginx
systemctl reload nginx
systemctl restart nginx
systemctl stop nginx
systemctl disable nginxComprobación detallada del estado de un servicio
systemctl status proporciona una vista detallada de una unidad. Comprender su salida es fundamental para diagnosticar problemas rápidamente.
- Loaded: ruta al archivo de unidad y si está habilitado durante el arranque
- Active: estado actual —
active (running),inactive (dead),failed - Main PID: identificador del proceso principal del servicio
- CGroup: todos los procesos secundarios pertenecientes al servicio
- Log lines: las entradas más recientes del journal para esta unidad
También puede consultar únicamente el estado activo con systemctl is-active y el estado de habilitación con systemctl is-enabled, lo que resulta ideal para utilizarlos en scripts.
#!/usr/bin/env bash
# Script-friendly service health check
SERVICE="sshd"
if systemctl is-active --quiet "$SERVICE"; then
echo "$SERVICE is running."
else
echo "$SERVICE is NOT running. Attempting restart..."
systemctl restart "$SERVICE"
fi
if systemctl is-enabled --quiet "$SERVICE"; then
echo "$SERVICE is enabled at boot."
else
echo "WARNING: $SERVICE is not enabled at boot."
fiListado y filtrado de unidades
Al gestionar muchos servicios, necesita formas de listar y filtrar unidades de manera eficiente. systemctl list-units muestra todas las unidades cargadas actualmente, mientras que list-unit-files muestra todos los archivos de unidad instalados y su estado de habilitación.
Opciones de filtrado útiles:
--type=service— mostrar solo las unidades de servicio--state=failed— mostrar solo las unidades que han fallado--state=active— mostrar solo las unidades activas--all— incluir las unidades inactivas en el listado
Combinar estos filtros con grep permite crear potentes cadenas de inspección en scripts de mantenimiento.
#!/usr/bin/env bash
# List all failed services and report them
echo "=== Failed Services ==="
systemctl list-units --type=service --state=failed --no-legend
echo ""
echo "=== Services Enabled at Boot ==="
systemctl list-unit-files --type=service --state=enabled --no-legend | awk '{print $1}'Anatomía de un archivo de unidad de servicio de systemd
Un archivo de unidad de servicio es un archivo de texto plano con formato similar a INI, compuesto por secciones. Cada sección controla un aspecto diferente del ciclo de vida de la unidad.
- [Unit] — metadatos: descripción y dependencias de orden (
After=,Requires=,Wants=) - [Service] — cómo iniciar y detener el proceso:
ExecStart,ExecStop,Restart,User,WorkingDirectory - [Install] — cuándo debe habilitarse esta unidad:
WantedBy=multi-user.targetsignifica que se activa durante un arranque normal multiusuario
Después de colocar o editar un archivo de unidad en /etc/systemd/system/, debe ejecutar systemctl daemon-reload para que systemd detecte los cambios.
Escritura del primer archivo de unidad de servicio
Vamos a crear un archivo de unidad de servicio sencillo para un script personalizado de servidor HTTP en Python. El archivo de unidad indica a systemd exactamente cómo gestionar este proceso, como si fuera cualquier otro servicio del sistema.
Directivas [Service] principales utilizadas aquí:
Type=simple— systemd trata el proceso deExecStartcomo el proceso principalUser=www-data— ejecutarlo con una cuenta que no sea root por motivos de seguridadWorkingDirectory— establecer el directorio de trabajo del procesoRestart=on-failure— reiniciar automáticamente el proceso si termina con un código distinto de ceroRestartSec=5— esperar 5 segundos entre los intentos de reinicio
#!/usr/bin/env bash
# Create a custom service unit file for a simple HTTP server
# Run as root
cat > /etc/systemd/system/mywebserver.service << 'EOF'
[Unit]
Description=My Custom Python Web Server
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/mysite
ExecStart=/usr/bin/python3 -m http.server 8080
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now mywebserver.service
systemctl status mywebserver.serviceTipos de servicio y ciclo de vida de los procesos
La directiva Type= de [Service] indica a systemd cómo determinar cuándo un servicio ha terminado de iniciarse. Elegir el tipo incorrecto es una causa frecuente de errores de orden.
Type=simple— valor predeterminado; systemd considera que el servicio se ha iniciado en cuanto se ejecutaExecStart. No se necesita ninguna señal de disponibilidad.Type=forking— el proceso deExecStartcrea un proceso hijo y termina; el daemon real se ejecuta como proceso secundario. UtilicePIDFile=para que systemd pueda realizar su seguimiento.Type=notify— el proceso envíasd_notify(READY=1)cuando está realmente listo. Es la opción más fiable para daemons complejos.Type=oneshot— se ejecuta una vez y termina; las unidades posteriores esperan a que finalice. Es ideal para scripts de configuración.Type=idle— funciona como simple, pero la ejecución se retrasa hasta que terminan todos los trabajos activos.
#!/usr/bin/env bash
# Example: oneshot service for a database migration script
# /etc/systemd/system/db-migrate.service
cat > /etc/systemd/system/db-migrate.service << 'EOF'
[Unit]
Description=Run Database Migrations
After=postgresql.service
Requires=postgresql.service
[Service]
Type=oneshot
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/scripts/migrate.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start db-migrate.serviceVariables de entorno y refuerzo de la seguridad
Los archivos de unidad de servicio admiten varias directivas para pasar variables de entorno y aplicar restricciones de seguridad; ambas son importantes en sistemas de producción.
Directivas de entorno:
Environment="KEY=value"— establecer una única variable en líneaEnvironmentFile=/etc/myapp/env— cargar variables desde un archivo (unaKEY=valuepor línea)
Directivas habituales de refuerzo de la seguridad:
NoNewPrivileges=true— impedir que el proceso obtenga privilegios adicionales mediante setuidProtectSystem=strict— montar/usr,/booty/etccomo de solo lecturaPrivateTmp=true— proporcionar al servicio su propio/tmpaisladoCapabilityBoundingSet=— eliminar todas las capacidades de Linux
#!/usr/bin/env bash
# Hardened service unit with environment file
cat > /etc/systemd/system/secureapp.service << 'EOF'
[Unit]
Description=Secure Application Daemon
After=network.target
[Service]
Type=simple
User=secureapp
Group=secureapp
WorkingDirectory=/opt/secureapp
EnvironmentFile=/etc/secureapp/env
ExecStart=/opt/secureapp/bin/server
Restart=on-failure
RestartSec=10
# Security hardening
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
CapabilityBoundingSet=
ReadWritePaths=/var/lib/secureapp /var/log/secureapp
[Install]
WantedBy=multi-user.target
EOF
# Create the environment file separately so secrets stay out of the unit file
install -m 600 -o secureapp /dev/null /etc/secureapp/env
echo 'APP_PORT=9000' >> /etc/secureapp/env
echo 'DB_URL=postgresql://localhost/mydb' >> /etc/secureapp/env
systemctl daemon-reloadIntroducción a las unidades de temporizador de systemd
Un temporizador de systemd es una unidad que activa otra unidad (normalmente un .service) según una programación. Sustituye los trabajos tradicionales de cron por un mecanismo más integrado, con registros y más fácil de controlar.
Cada unidad de temporizador (foo.timer) está emparejada con una unidad de servicio con el mismo nombre base (foo.service) que realiza el trabajo. Debe habilitar e iniciar el temporizador, no el servicio directamente.
Tipos de temporizador:
- Temporizadores en tiempo real (de calendario) — se activan en horas concretas del reloj mediante expresiones
OnCalendar=comodaily,weeklyoMon *-*-* 02:00:00 - Temporizadores monotónicos — se activan en relación con un evento del sistema mediante
OnBootSec=,OnActiveSec=oOnUnitActiveSec=
Escritura de un archivo de unidad de temporizador
Vamos a crear un par completo de temporizador y servicio que ejecute un script de copia de seguridad todos los días a las 02:00. Observe que la sección [Timer] se encuentra en su propio archivo .timer, mientras que el trabajo se define en el archivo .service asociado.
Directivas [Timer] principales:
OnCalendar=— expresión de calendario que define la programaciónPersistent=true— si el sistema estaba apagado cuando debía activarse el temporizador, ejecutarlo inmediatamente en el siguiente arranqueRandomizedDelaySec=— añadir hasta N segundos de variación aleatoria para evitar una avalancha de solicitudes cuando muchos hosts comparten la misma programaciónUnit=— unidad de destino explícita (opcional si los nombres coinciden)
#!/usr/bin/env bash
# Create a daily backup timer pair
# Run as root
# 1. The service that does the work
cat > /etc/systemd/system/daily-backup.service << 'EOF'
[Unit]
Description=Daily Database Backup
After=network.target postgresql.service
[Service]
Type=oneshot
User=backup
ExecStart=/usr/local/bin/backup-db.sh
StandardOutput=journal
StandardError=journal
EOF
# 2. The timer that schedules it
cat > /etc/systemd/system/daily-backup.timer << 'EOF'
[Unit]
Description=Run Daily Database Backup at 02:00
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=300
[Install]
WantedBy=timers.target
EOF
systemctl daemon-reload
systemctl enable --now daily-backup.timer
# Verify
systemctl list-timers daily-backup.timerInspección de registros y resolución de problemas de unidades
systemd dirige toda la salida de los servicios al journal, que se consulta con journalctl. Esto centraliza los registros de todas las unidades en un único almacén en el que se pueden realizar búsquedas.
Opciones esenciales de journalctl para resolver problemas de servicios:
-u <unit>— filtrar por nombre de unidad-f— seguir el registro en tiempo real (comotail -f)-n 50— mostrar solo las últimas 50 líneas--since "1 hour ago"— limitar por intervalo de tiempo-p err— mostrar solo los errores y las prioridades superiores-b— mostrar únicamente los registros del arranque actual
Cuando una unidad no se inicia, lo primero que debe ejecutar es journalctl -u <unit> -n 30 --no-pager, seguido de systemctl status <unit> para obtener el contexto de los errores recientes.
#!/usr/bin/env bash
# Troubleshooting helper: dump unit status and recent logs
# Usage: ./service-debug.sh <unit-name>
UNIT="${1:-nginx.service}"
echo "=============================="
echo "STATUS: $UNIT"
echo "=============================="
systemctl status "$UNIT" --no-pager -l
echo ""
echo "=============================="
echo "RECENT LOGS (last 50 lines): $UNIT"
echo "=============================="
journalctl -u "$UNIT" -n 50 --no-pager
echo ""
echo "=============================="
echo "ERRORS ONLY (current boot)"
echo "=============================="
journalctl -u "$UNIT" -b -p err --no-pagerComprobación de conocimientos: archivos de unidad de systemd
Compruebe sus conocimientos sobre la configuración de unidades de servicio y temporizador de systemd.
Repaso de la lección: control de servicios de systemd y escritura de archivos de unidad
En esta lección ha explorado los conceptos fundamentales de la gestión de servicios de systemd y la creación de archivos de unidad con un nivel profesional. A continuación se resumen los temas tratados:
- Conceptos básicos de systemctl — start, stop, restart, reload, enable, disable, status, is-active e is-enabled para realizar comprobaciones adecuadas para scripts
- Listado y filtrado —
list-unitsylist-unit-filescon las opciones--typey--statepara aislar servicios fallidos o habilitados - Anatomía de los archivos de unidad — las tres secciones
[Unit],[Service]y[Install], junto con sus directivas principales - Tipos de servicio —
simple,forking,notifyyoneshot>, y cuándo utilizar cada uno - Entorno y seguridad —
EnvironmentFile,NoNewPrivileges,ProtectSystemyPrivateTmppara daemons reforzados - Unidades de temporizador — asociación de archivos
.timery.service, expresionesOnCalendary comportamiento de recuperación dePersistent - Journalctl — filtrado por unidad, tiempo, arranque y prioridad para diagnosticar fallos de forma eficiente
Con estas habilidades puede gestionar cualquier servicio del sistema, programar tareas recurrentes de forma fiable y crear archivos de unidad preparados para producción para sus propios daemons.
Preguntas frecuentes
¿La lección «Control de servicios systemd y escritura de archivos unit» es gratis?
Sí — el texto completo de «Control de servicios systemd y escritura de archivos unit» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de DevOps Bootcamp, actualiza a CoddyKit PRO. El curso de DevOps Bootcamp incluye 4 lecciones en total.
¿Qué aprenderé en «Control de servicios systemd y escritura de archivos unit»?
Administre servicios con systemctl y cree archivos unit y de temporizador personalizados para demonios basados en scripts. Practicas DevOps Bootcamp con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar DevOps Bootcamp?
No se requiere experiencia previa. DevOps Bootcamp en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Control de servicios systemd y escritura de archivos unit»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de DevOps Bootcamp?
Sí. Cada lección de DevOps Bootcamp incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Automatización del aprovisionamiento de usuarios y grupos
- Control de servicios systemd y escritura de archivos unit
- Automatización de discos, sistemas de archivos y montajes
- Creación de scripts de comprobación y alerta del estado del sistema