Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

Supervisor Administración de Linux

Cuando prendemos un computador con Linux, detrás de cámaras pasan muchas cosas antes de que podamos escribir comandos o usar aplicaciones. En esta lección vamos a ver paso a paso qué sucede en ese arranque, quién se encarga de lanzar los programas y cómo podemos controlar o ver sus registros. Vamos a hablar de algo muy importante: systemd.


¿Qué es un supervisor de procesos?

Al encender el sistema, lo primero que se inicia no es nuestro navegador ni el escritorio, sino un programa especial llamado supervisor de procesos.

Su nombre técnico es init system y su tarea principal es:

  • Iniciar los procesos del sistema (como servicios de red, bases de datos, servidores web, etc.).
  • Monitorear si están en ejecución.
  • Reiniciarlos si fallan.
  • Detenerlos cuando apagamos o reiniciamos el sistema.

Hoy en día, la mayoría de distribuciones Linux (como Ubuntu, Debian, Fedora, etc.) utilizan systemd como su supervisor de procesos. Es poderoso y muy flexible.


El árbol de procesos

Todos los procesos que corren en el sistema provienen (directamente o no) de este supervisor inicial. Se forma un árbol donde cada proceso puede lanzar otros procesos “hijos”.

Para ver ese árbol, podemos usar el siguiente comando en la terminal:

ps auxf

Este comando muestra todos los procesos del sistema y su jerarquía. Un ejemplo simplificado sería:

root         1   /sbin/init         # Este es systemd, el primer proceso
root     1000    \_ nginx           # Proceso lanzado por systemd
root     1001        \_ nginx       # Otro hijo de nginx
Cada "\_" indica que un proceso fue iniciado por otro.

¿Qué es systemd y cómo se configura?

Systemd no solo lanza procesos, también los configura. Para decirle a systemd cómo iniciar, parar o reiniciar un programa, usamos archivos especiales llamados unit files o archivos de unidad, que tienen extensión .service.

Veamos un ejemplo real para el servidor web Nginx:

# /lib/systemd/system/nginx.service

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Ahora expliquemos por partes:

Sección [Unit]

  • Define dependencias: en qué momento se puede iniciar este servicio.
  • En este caso, nginx se inicia después que el sistema de red (network-online.target) esté listo.

Sección [Service]

  • Explica cómo iniciar y detener el servicio.
  • ExecStartPre: se ejecuta antes del arranque para probar la configuración.
  • ExecStart: el comando que arranca nginx.
  • ExecReload: cómo recargar la configuración sin detener el servicio.
  • ExecStop: cómo parar nginx limpiamente.

Sección [Install]

  • Dice en qué "nivel" de ejecución debe activarse automáticamente.
  • En este caso, al llegar a multi-user.target (cuando ya funciona la red y el sistema está listo para varios usuarios).
Normalmente, estos archivos vienen incluidos con el software. Pero si instalamos programas que no lo incluyen, podemos escribirlos nosotros mismos.

Control de recursos con systemd

Systemd también puede ayudarnos a controlar qué tanta memoria o CPU usan los programas. Esto es útil en servidores o cuando no queremos que un proceso consuma todos los recursos del sistema..

Por ejemplo, podemos agregar líneas como estas dentro de la sección [Service]:

MemoryLimit=200M      # Limita la memoria a 200 megas
CPUQuota=50%          # Solo puede usar hasta el 50% del CPU

¿Dónde están los logs?

Necesitamos saber qué está pasando con los servicios que ejecuta systemd: si arrancaron bien, si fallaron, etc. Para eso, systemd tiene su propio sistema de registro o logging llamado journal.

Para ver los mensajes de un servicio usamos:

journalctl -u nginx.service

Este comando nos muestra todos los mensajes generados por nginx, siempre y cuando esté controlado por systemd.

Para que los mensajes aparezcan en el journal, el servicio debe estar configurado para enviar su salida estándar (STDOUT) allí.

Tabla resumen de comandos útiles

Comando Para qué sirve
ps auxf Ver todos los procesos del sistema en árbol
systemctl start nombre.service Iniciar un servicio manualmente
systemctl stop nombre.service Detener un servicio
systemctl status nombre.service Ver estado actual del servicio
systemctl enable nombre.service Activar servicio al arrancar el sistema
journalctl -u nombre.service Ver los logs del servicio

Resumen

  • Cada vez que Linux arranca, lo primero que se ejecuta es un proceso supervisor llamado systemd.
  • Systemd se encarga de lanzar, detener y reiniciar otros procesos.
  • La relación entre procesos forma un árbol, que podemos ver con ps auxf.
  • Las configuraciones de los servicios viven en archivos .service, y definen comandos de arranque, parada y más.
  • Podemos controlar recursos (memoria, CPU) desde los archivos de servicio.
  • Todos los logs de servicios se pueden consultar con journalctl.

Listo, ahora tenemos una mejor idea de cómo el sistema cobra vida al arrancar, cómo se lanzan los servicios y cómo supervisarlos. Con este conocimiento podemos depurar problemas o configurar nuestros propios servicios correctamente.


Trabajo independiente

En la práctica, a menudo es necesario lograr que un servicio se reinicie automáticamente después de que el sistema se reinicie. Para esto, como ya habrás adivinado, se utiliza un supervisor. Vamos a experimentar con systemd y configurar el inicio automático de un servidor web.

1️⃣ Crea un servidor HTTP sencillo. Abre la terminal y ejecuta el siguiente comando. Esto iniciará un servidor web en el puerto 3000.

python3 -m http.server 3000
    

2️⃣ Crea un servicio systemd. Crea un archivo llamado /etc/systemd/system/simple-http.service y agrega el siguiente contenido:

[Unit]
Description=Servidor HTTP Sencillo
After=network.target

[Service]
ExecStart=/usr/bin/python3 -m http.server 3000
Restart=always
User=nobody
WorkingDirectory=/home/<tu-usuario>

[Install]
WantedBy=multi-user.target
    

3️⃣ Inicia y verifica el servicio.

sudo systemctl daemon-reload
sudo systemctl start simple-http
sudo systemctl enable simple-http
    

4️⃣ Para verificar el estado del servicio, usa el siguiente comando:

sudo systemctl status simple-http
    

Si todo está configurado correctamente, el servidor funcionará y se reiniciará automáticamente en caso de fallos o cuando se reinicie el sistema.


Materiales adicionales

  1. Systemd 📚 Wiki de ArchLinux

Para acceder completo a curso necesitas un plan básico

El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY