- ¿Qué es un supervisor de procesos?
- El árbol de procesos
- ¿Qué es systemd y cómo se configura?
- Control de recursos con systemd
- ¿Dónde están los logs?
- Tabla resumen de comandos útiles
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?
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
¿Qué es systemd y cómo se configura?
.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).
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?
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.
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. Systemdse 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
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.