Procesos y servicios en Linux: cómo funcionan, cómo se gestionan y por qué importan
· 14 min de lectura
Aprende qué son los procesos y los servicios en Linux, cómo verlos con ps y top, cómo controlarlos con kill y systemctl, cómo programar tareas con cron y por qué todo esto es esencial en ciberseguridad.
Cuando enciendes un ordenador con Linux, la pantalla puede parecer tranquila, pero por dentro están ocurriendo cientos de cosas al mismo tiempo. Cada programa que se ejecuta, desde el navegador hasta el propio sistema operativo, es un proceso. Y muchos de esos procesos son servicios: programas que arrancan solos y trabajan en segundo plano sin que los veas, como el servidor web, la base de datos o el servicio de red.
Entender los procesos y los servicios es una habilidad fundamental tanto para administrar un sistema como para auditarlo. Si haces una prueba de penetración y consigues ejecutar código en una máquina, necesitas saber qué está corriendo, qué puedes detener, qué puedes aprovechar y cómo programar tareas. Muchas escaladas de privilegios explotan servicios mal configurados o tareas programadas con permisos excesivos.
Esta lección te enseña desde cero qué es un proceso, cómo nace y muere, cómo listarlos y controlarlos, cómo funcionan los servicios con systemd, cómo programar tareas con cron y qué señales usa Linux para comunicarse con los programas. Es la quinta lección de la Tanda 12 de /aprende, dedicada a fundamentos desde cero.
Practica siempre en sistemas propios o en entornos autorizados, como los laboratorios de whoami-labs. Gestionar procesos y servicios en sistemas ajenos sin permiso es un delito.
Qué es un proceso en Linux#
Un proceso es cualquier programa en ejecución. Cuando abres una terminal, se crea un proceso. Cuando escribes ls para listar archivos, se crea otro proceso que dura una fracción de segundo. Cuando abres un editor de texto, otro proceso más.
Piensa en los procesos como empleados en una oficina. Cada uno tiene un número de identificación único (su PID, Process ID), un jefe que lo creó (su proceso padre, con un PPID) y una tarea asignada. Cuando el empleado termina su trabajo, sale de la oficina y libera su escritorio.

El primer proceso que arranca en Linux es systemd (o init en sistemas más antiguos), y tiene el PID 1. Todos los demás procesos descienden de él, formando un árbol. Si el proceso padre muere antes que sus hijos, systemd los «adopta».
Hay dos tipos principales de procesos:
- Procesos interactivos: los lanzas tú desde la terminal y esperan tu entrada. Por ejemplo, un editor como
nanoovim. - Demonios (daemons): procesos que corren en segundo plano sin interacción. Sus nombres suelen terminar en
d:sshd(servidor SSH),httpd(servidor web),crond(tareas programadas).
Por qué es importante#
Saber gestionar procesos te da control real sobre el sistema. Aquí van algunas situaciones cotidianas:
- Un programa se queda colgado y necesitas cerrarlo a la fuerza.
- Quieres saber qué está consumiendo toda la CPU o la memoria.
- Necesitas ejecutar un script largo y cerrar la terminal sin que se detenga.
- Estás auditando una máquina y quieres ver qué servicios están corriendo y cuáles son vulnerables.
- Descubres una tarea programada con cron que ejecuta un script como root, y ese script es escribible por cualquier usuario: acabas de encontrar un vector de escalada de privilegios.
En ciberseguridad, las tareas cron mal configuradas son uno de los vectores de escalada más frecuentes en los laboratorios de práctica y en entornos reales.
Conceptos clave#
| Concepto | Qué es | Ejemplo |
|---|---|---|
| Proceso | Un programa en ejecución con su propio espacio de memoria | Cada vez que ejecutas un comando se crea un proceso |
| PID | Número único que identifica a cada proceso | El proceso init o systemd siempre tiene PID 1 |
| Demonio (daemon) | Proceso que corre en segundo plano sin terminal | sshd, httpd, crond |
| Servicio | Un demonio gestionado por el sistema de inicio | El servicio SSH que arranca al encender el servidor |
| Señal | Mensaje que el sistema envía a un proceso para controlarlo | SIGTERM pide terminar, SIGKILL fuerza la terminación |
| Tarea cron | Comando que se ejecuta automáticamente en un horario definido | Un script de respaldo que corre cada noche a las 3 AM |
Cómo funciona#
El sistema de inicio: SysV vs systemd#
Cuando Linux arranca, el kernel carga el sistema de inicio, que es el encargado de levantar todos los servicios. Existen dos generaciones principales:
- SysV init (el clásico): usaba scripts en
/etc/init.d/y los servicios se arrancaban en orden, uno tras otro. Era simple pero lento: si un servicio tardaba, todos los demás esperaban. - systemd (el estándar actual): arranca servicios en paralelo, lo que acelera el inicio. Usa archivos de configuración llamados units (unidades) que viven en
/etc/systemd/system/y/lib/systemd/system/. Hoy es el sistema de inicio en la mayoría de distribuciones: Debian, Ubuntu, Fedora, CentOS, Arch.
Las señales#
Linux controla los procesos mediante señales. Son como toques en el hombro que le dicen al proceso qué hacer:
| Señal | Número | Efecto | Analogía |
|---|---|---|---|
| SIGTERM | 15 | Pide al proceso que termine limpiamente | Decirle a alguien que es hora de irse |
| SIGKILL | 9 | Fuerza la terminación inmediata, sin dar opción a guardar nada | Cortar la luz de la oficina |
| SIGHUP | 1 | Indica que la terminal se cerró. Muchos servicios lo usan para releer su configuración | Avisar de un cambio de turno |
| SIGSTOP | 19 | Pausa el proceso | Poner en pausa una canción |
| SIGCONT | 18 | Reanuda un proceso pausado | Darle al play |
Cuando ejecutas kill sin especificar señal, envía SIGTERM (la número 15) por defecto. Si el proceso no responde, puedes usar SIGKILL (la número 9) como último recurso.
Ciclo de vida de un proceso#
Cada proceso pasa por estos estados:
- Creación: un proceso padre usa la llamada al sistema
fork()para crear una copia de sí mismo, y luegoexec()para reemplazar esa copia con el programa nuevo. - En ejecución (Running): el proceso está usando la CPU o esperando su turno.
- Dormido (Sleeping): el proceso espera algo externo, como datos de red o del disco.
- Detenido (Stopped): el proceso está pausado, normalmente por una señal SIGSTOP o porque presionaste Ctrl+Z.
- Zombi (Zombie): el proceso terminó, pero su padre aún no recogió su código de salida. Es como un empleado que dejó una nota de renuncia pero nadie la ha leído. Si ves muchos zombis, significa que un programa padre tiene un fallo.
Uso práctico paso a paso#
Paso 1: Ver los procesos activos con ps#
El comando ps muestra los procesos en ejecución. Sin opciones, solo muestra los de tu terminal actual:
ps
PID TTY TIME CMD
1234 pts/0 00:00:00 bash
1250 pts/0 00:00:00 ps
Para ver todos los procesos del sistema, usa la combinación aux:
ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 169584 13124 ? Ss 08:00 0:02 /lib/systemd/systemd
root 2 0.0 0.0 0 0 ? S 08:00 0:00 [kthreadd]
www-data 1520 0.1 1.2 274532 52840 ? S 08:01 0:15 /usr/sbin/apache2 -k start
ana 2100 0.0 0.1 21464 5120 pts/0 Ss 09:30 0:00 -bash
La columna STAT te dice el estado: S (dormido), R (corriendo), Z (zombi), T (detenido). Las letras extras añaden detalle: s es líder de sesión, + está en primer plano.
Para buscar un proceso específico, combina ps con grep:
ps aux | grep apache
www-data 1520 0.1 1.2 274532 52840 ? S 08:01 0:15 /usr/sbin/apache2
Paso 2: Monitorear en tiempo real con top y htop#
El comando top muestra los procesos en tiempo real, actualizándose cada pocos segundos. Es como un panel de control:
top
Verás la carga del sistema, el uso de CPU y memoria, y una lista ordenada de procesos. Dentro de top, puedes pulsar:
qpara salir.kpara enviar una señal a un proceso (te pedirá el PID).Mpara ordenar por uso de memoria.Ppara ordenar por uso de CPU.
htop es una versión mejorada con colores e interfaz más amigable. No viene instalado por defecto, pero se instala fácilmente:
sudo apt install htop
htop
Con htop puedes navegar con las flechas, seleccionar procesos y usar teclas de función (F9 para enviar señales, F6 para ordenar).
Paso 3: Controlar procesos con kill, bg y fg#
Para terminar un proceso, usa kill seguido de su PID:
kill 1520
Eso envía SIGTERM. Si el proceso no responde:
kill -9 1520
Eso envía SIGKILL, que no se puede ignorar. Úsalo solo como último recurso porque el proceso no tiene oportunidad de cerrar archivos o liberar recursos limpiamente.
Para manejar procesos en segundo plano desde la terminal:
# Lanzar un proceso en segundo plano
./mi_script.sh &
# Ver los trabajos de la terminal actual
jobs
[1]+ Running ./mi_script.sh &
# Traer un trabajo a primer plano
fg %1
# Pausar un proceso (Ctrl+Z) y enviarlo a segundo plano
bg %1
Si quieres que un proceso siga corriendo después de cerrar la terminal, usa nohup:
nohup ./script_largo.sh &
Esto redirige la salida a un archivo nohup.out y hace que el proceso ignore la señal SIGHUP que se envía cuando la terminal se cierra.
Paso 4: Gestionar servicios con systemctl#
El comando systemctl es tu herramienta principal para controlar servicios en distribuciones con systemd:
# Ver el estado de un servicio
sudo systemctl status ssh
# Arrancar un servicio
sudo systemctl start apache2
# Detener un servicio
sudo systemctl stop apache2
# Reiniciar un servicio (lo para y lo vuelve a arrancar)
sudo systemctl restart apache2
# Habilitar un servicio para que arranque con el sistema
sudo systemctl enable ssh
# Deshabilitar el arranque automático
sudo systemctl disable bluetooth
# Listar todos los servicios activos
systemctl list-units --type=service --state=active
Para ver los logs de un servicio, usa journalctl:
# Ver logs del servicio SSH
sudo journalctl -u ssh
# Ver solo los últimos 50 registros
sudo journalctl -u ssh -n 50
# Seguir los logs en tiempo real
sudo journalctl -u ssh -f
Paso 5: Programar tareas con cron#
Cron ejecuta comandos automáticamente en los horarios que definas. Cada usuario tiene su propia tabla de tareas (crontab):
# Editar tu crontab
crontab -e
# Ver las tareas programadas
crontab -l
La sintaxis de cron usa cinco campos seguidos del comando:
minuto hora día_del_mes mes día_de_la_semana comando
0-59 0-23 1-31 1-12 0-7(0 y 7 = domingo)
Ejemplos:
# Ejecutar un respaldo cada noche a las 3:00 AM
0 3 * * * /home/ana/respaldo.sh
# Cada lunes a las 8:30
30 8 * * 1 /usr/local/bin/informe.sh
# Cada 15 minutos
*/15 * * * * /usr/bin/check_disk.sh
# El primer día de cada mes a medianoche
0 0 1 * * /opt/limpieza.sh
El asterisco * significa «todos los valores posibles» y */N significa «cada N unidades». Además del crontab personal, existen directorios del sistema como /etc/cron.d/, /etc/cron.daily/, /etc/cron.hourly/ donde se colocan scripts que el sistema ejecuta periódicamente.
Qué puedes hacer con esto#
| Tarea | Comando o técnica |
|---|---|
| Saber qué consume más CPU | top o htop, ordenar por CPU |
| Cerrar un programa colgado | kill con el PID del proceso |
| Ejecutar algo sin que pare al cerrar la terminal | nohup comando y signo de ampersand |
| Arrancar un servidor web | sudo systemctl start apache2 |
| Hacer que SSH arranque al encender | sudo systemctl enable ssh |
| Ver por qué un servicio falló | sudo journalctl -u servicio |
| Programar un respaldo automático | Añadir línea en crontab -e |
| Buscar tareas cron como vector de ataque | Revisar crontab -l y /etc/cron.d/ |
Buenas prácticas#

- Usa SIGTERM antes de SIGKILL: siempre intenta primero
kill PID(SIGTERM). Solo usakill -9cuando el proceso no responde, porque SIGKILL no permite que el programa cierre archivos ni libere recursos correctamente. - No ejecutes servicios como root si no es necesario: muchos servicios pueden correr con un usuario con menos privilegios. Si un atacante compromete el servicio, obtiene los permisos de ese usuario, no los de root.
- Revisa los crontabs con regularidad: tanto el tuyo (
crontab -l) como el del sistema (/etc/crontab,/etc/cron.d/). En auditorías, busca scripts ejecutados por root que sean escribibles por otros usuarios. - Usa rutas absolutas en cron: dentro de un crontab, la variable PATH puede ser distinta. En lugar de escribir
respaldo.sh, escribe/home/ana/respaldo.sh. - Habilita solo los servicios que necesites: cada servicio activo es una superficie de ataque. Si no usas Bluetooth en un servidor, desactívalo con
systemctl disable bluetooth. - Consulta los logs antes de buscar en Internet:
journalctl -u serviciosuele explicar por qué algo falló. Es más rápido y más preciso que buscar el error a ciegas.
Errores comunes de principiante#
- Usar siempre kill -9: es tentador porque «siempre funciona», pero no da oportunidad al programa de cerrar limpiamente. Puede dejar archivos corruptos o conexiones de red abiertas.
- Olvidar sudo con systemctl: los comandos que modifican servicios (start, stop, enable) requieren permisos de root. Si te dice «access denied», añade
sudo. - Confundir enable con start:
enablehace que el servicio arranque automáticamente en el próximo reinicio, pero no lo arranca ahora. Para arrancarlo ahora, usastart. Si quieres ambos:sudo systemctl enable --now ssh. - Poner comandos relativos en cron: cron no usa tu PATH habitual. Un script que funciona en tu terminal puede fallar en cron porque no encuentra los comandos. Usa siempre rutas absolutas.
- Ignorar los procesos zombi: uno o dos zombis son normales y no consumen recursos. Pero muchos zombis indican que un programa padre tiene un bug y no está recogiendo el estado de salida de sus hijos.
- Dejar servicios innecesarios activos: en un servidor de producción, cada servicio activo es un posible punto de entrada. Revisa con
systemctl list-units --type=servicey desactiva lo que no necesites.
Preguntas frecuentes#
Qué diferencia hay entre un proceso y un servicio#
Un proceso es cualquier programa en ejecución. Un servicio es un tipo específico de proceso: un demonio que corre en segundo plano y está gestionado por el sistema de inicio (systemd). Todos los servicios son procesos, pero no todos los procesos son servicios. Cuando ejecutas ls, es un proceso que dura una fracción de segundo. Cuando sshd está esperando conexiones, es un servicio.
Puedo recuperar un proceso que maté con kill -9#
No. SIGKILL termina el proceso de forma inmediata e irrecuperable. Si el proceso tenía datos sin guardar, se pierden. Por eso siempre conviene intentar primero SIGTERM (kill sin -9), que le da al programa la oportunidad de guardar su estado y cerrar limpiamente.
Qué pasa si edito un crontab con errores de sintaxis#
Cron no ejecutará las líneas que tengan errores, pero tampoco te avisará de forma clara. Puedes comprobar si cron reporta errores mirando los logs: sudo journalctl -u cron o sudo grep CRON /var/log/syslog. Una buena práctica es verificar la sintaxis antes de guardar usando herramientas en línea o probando el comando manualmente.
Cómo sé si un servicio va a arrancar tras un reinicio#
Usa systemctl is-enabled nombre_servicio. Si dice «enabled», arrancará automáticamente. Si dice «disabled», no lo hará. También puedes ver todos los servicios habilitados con systemctl list-unit-files --state=enabled.
Por qué htop muestra más procesos que ps#
Depende de las opciones. ps sin argumentos solo muestra los procesos de tu terminal. ps aux muestra todos los procesos del sistema, y debería coincidir con lo que ves en htop. La diferencia visual es que htop muestra los hilos de cada proceso por defecto, lo que puede hacer que la lista parezca más larga.
Qué es un proceso zombi y debo preocuparme#
Un proceso zombi es uno que ya terminó de ejecutarse pero su proceso padre no ha recogido su código de salida. No consume CPU ni memoria significativa, solo ocupa una entrada en la tabla de procesos. Uno o dos zombis son normales. Si ves decenas, el proceso padre tiene un bug. La solución es arreglar o reiniciar el proceso padre, no intentar matar al zombi con kill, porque ya está muerto.
Resumen#
- Un proceso es cualquier programa en ejecución, identificado por su PID. El proceso con PID 1 (systemd o init) es el padre de todos los demás.
- Usa ps aux para listar todos los procesos y top o htop para monitorearlos en tiempo real.
- Controla procesos con kill (SIGTERM por defecto, SIGKILL con -9 solo si no responde) y gestiona el primer y segundo plano con fg, bg y el operador &.
- Los servicios se gestionan con systemctl: start, stop, enable, status. Los logs se consultan con journalctl.
- Cron permite programar tareas automáticas con una sintaxis de cinco campos: minuto, hora, día del mes, mes, día de la semana.
- En ciberseguridad, las tareas cron mal configuradas y los servicios con permisos excesivos son vectores habituales de escalada de privilegios.