Ghost AcademySecLearn// Seguridad Informática
🌐 unfantasmaenelsistema.com
⚙️ Linux · Procesos · Servicios · Systemd
Administración de Procesos
y Servicios

Conceptos fundamentales de procesos y daemons, control con señales, y gestión completa de servicios con systemctl y Systemd.

pstopkill systemctlsystemd PIDSIGTERMSIGKILL daemonunit file

Conceptos Fundamentales

Antes de administrar procesos y servicios, es esencial entender qué son y cómo se relacionan entre sí en el contexto de Linux.

Concepto 1
Proceso (Process)

Una instancia de un programa en ejecución. Cuando inicias cualquier programa, el SO lo convierte en uno o varios procesos, cada uno con un identificador único.

Concepto 2
Servicio / Daemon

Un proceso especial que se ejecuta en segundo plano, sin interacción directa del usuario, generalmente iniciado al arrancar el sistema. Ej: Nginx, SSH, gestor de red.

Concepto 3 — El proceso raíz
Init / Systemd (PID 1)

El primer proceso que arranca en Linux es init (PID 1). En las distribuciones modernas (Ubuntu, Fedora, Debian, RHEL), systemd ha reemplazado a init como gestor de arranque y servicios. Controla el inicio, detención, reinicio y estado de casi todos los servicios del sistema.

Identidad de un proceso

IdentificadorNombre completoDescripción
PIDProcess IDNúmero único asignado a cada proceso por el sistema operativo para identificarlo.
PPIDParent Process IDPID del proceso que inició el proceso actual. Todos los procesos tienen un padre, excepto el primero (systemd/init).

Monitoreo de Procesos

Estos comandos permiten observar qué está ejecutando el sistema y cómo se están consumiendo los recursos.

ComandoFunciónDescripción
psLista estáticaMuestra los procesos que se ejecutan en el momento en que se ejecuta el comando.
ps auxTodos los procesosMuestra todos los procesos, incluyendo los no asociados a una terminal. La combinación más común.
topMonitor interactivoLista dinámica de procesos, actualizada en tiempo real. Ideal para ver consumo de CPU y memoria.
htoptop mejoradoVersión avanzada de top, con barras de CPU/Memoria y navegación por teclado.

Buscar un proceso por nombre

bash
ps aux | grep nginx
Salida típica
USER       PID %CPU %MEM    VSZ   RSS TTY   STAT START   TIME COMMAND
www-data  1024  0.0  0.1  55380  3200 ?     S    08:00   0:00 nginx: worker process
root       987  0.0  0.1  55380  2800 ?     Ss   08:00   0:00 nginx: master process
bash — Obtener solo el PID de un proceso
pgrep firefox

Señales y Control de Procesos

Linux utiliza señales para comunicarse con los procesos. Son la forma en que el sistema (o el usuario) puede indicarle a un proceso que haga algo: terminar, recargar configuración, pausarse, etc.

Señales principales

SeñalNúmeroComandoDescripción
SIGTERM 15 kill <PID> Terminar (elegante). Pide al proceso que finalice de forma ordenada, guardando su trabajo. Es la señal por defecto.
SIGKILL 9 kill -9 <PID> Matar (forzado). Fuerza la terminación inmediata. Usar como último recurso, ya que no permite al proceso limpiarse ni guardar datos.
SIGHUP 1 kill -1 <PID> Recargar configuración. Se usa para indicarle a un servicio que relea su archivo de configuración sin detenerse.

Ejemplo completo — Encontrar y matar Firefox

PASO 1 — Encontrar el PID
bash
pgrep firefox
Captura — salida de pgrep firefox
Salida de pgrep Firefox mostrando el PID
PASO 2 — Enviar señal TERM (elegante)
bash
kill 22664
PASO 3 — Si no responde, usar SIGKILL
bash
kill -9 22664
bash — Matar todos los procesos por nombre
killall firefox
⚠️ Orden recomendado: Usa siempre kill <PID> (SIGTERM) primero. Solo recurre a kill -9 si el proceso no responde. SIGKILL puede dejar datos corruptos o archivos temporales abiertos.

Foreground y Background

Cuando ejecutas un programa desde la terminal, puedes controlarlo entre el primer plano (foreground) y el segundo plano (background).

ComandoFunción
&Ejecutar un comando directamente en segundo plano: comando &
Ctrl + ZSuspender el trabajo en primer plano y enviarlo a la lista de jobs
jobsListar todos los trabajos suspendidos o en segundo plano de la sesión
fgTraer el último trabajo de segundo plano al primer plano
bgReanudar un trabajo suspendido en segundo plano
bash — Flujo típico
sleep 3600 &          # Iniciar en segundo plano
# [1] 12345

jobs                  # Ver trabajos activos
# [1]+ Running    sleep 3600 &

fg %1                 # Traer al primer plano
# Ctrl+Z para suspender de nuevo

bg %1                 # Reanudar en segundo plano

systemctl — Administración de Servicios

En casi todas las distribuciones modernas se utiliza el comando systemctl para controlar los servicios gestionados por Systemd.

Comandos básicos

TareaComando systemctlDescripción
Verificar estadosystemctl status <servicio>Muestra si el servicio está activo, su estado y las últimas entradas de registro.
Iniciarsudo systemctl start <servicio>Arranca un servicio que está detenido.
Detenersudo systemctl stop <servicio>Finaliza la ejecución de un servicio.
Reiniciarsudo systemctl restart <servicio>Detiene y luego vuelve a iniciar el servicio.
Recargar configsudo systemctl reload <servicio>Indica al servicio que relea su configuración sin detener el proceso principal.
ℹ️ reload vs restart: reload es menos disruptivo — el proceso sigue corriendo y solo recarga su configuración (equivale a enviar SIGHUP). restart detiene completamente el servicio y lo reinicia, interrumpiendo conexiones activas.

Ejemplo — Gestionar el Servidor SSH

El servidor SSH (sshd) es uno de los servicios más comunes en sistemas Linux. Aquí vemos cómo instalarlo, verificarlo y controlarlo.

PASO 1 — Instalar openssh-server (si no está disponible)
bash
sudo apt update
sudo apt install openssh-server
PASO 2 — Verificar el estado del servicio
bash
systemctl status ssh
# o también:
systemctl status sshd
Captura — salida de systemctl status ssh
Salida de systemctl status ssh
PASO 3 — Iniciar el servicio
bash
sudo systemctl start ssh
🔍 ¿Por qué ssh en lugar de sshd? El comando systemctl busca archivos de configuración llamados unidades (.service). En muchas distribuciones Ubuntu/Debian, el archivo se llama /lib/systemd/system/ssh.service. Systemd usa ese nombre (ssh) para gestionar el daemon que internamente se llama sshd.

Enable / Disable — Inicio Automático

Para que un servicio se inicie automáticamente cada vez que el sistema arranca, debes habilitarlo. Para que no arranque automáticamente, debes deshabilitarlo.

TareaComando systemctl
Habilitar inicio automáticosudo systemctl enable <servicio>
Deshabilitar inicio automáticosudo systemctl disable <servicio>
Verificar si está habilitadosystemctl is-enabled <servicio>

Ejemplo — Apache y CUPS

bash — Instalar y habilitar Apache
sudo apt update
sudo apt install apache2

# Habilitar para que arranque con el sistema
sudo systemctl enable apache2
bash — Deshabilitar el servidor de impresión
# Deshabilitar si no se necesita impresión
sudo systemctl disable cups

# Para volver a habilitarlo:
sudo systemctl enable cups.service
💡 enable vs start: enable configura el arranque automático pero no inicia el servicio ahora. start inicia el servicio inmediatamente pero no persiste tras reiniciar. Para ambas cosas a la vez usa: sudo systemctl enable --now <servicio>

Listar Servicios del Sistema

Para obtener una vista general de todos los servicios gestionados por Systemd, tanto activos como inactivos.

bash — Solo unidades activas
systemctl list-units --type=service
bash — Todas las unidades instaladas (activas e inactivas)
systemctl list-unit-files --type=service
Columnas de list-unit-files
UNIT FILE                    STATE     VENDOR PRESET
apache2.service              enabled   enabled
bluetooth.service            enabled   enabled
cups.service                 disabled  enabled
ssh.service                  enabled   enabled
snapd.service                enabled   enabled
ℹ️ Columna STATE: enabled = arranca con el sistema · disabled = no arranca automáticamente · static = no se puede habilitar/deshabilitar directamente · masked = bloqueado, no puede iniciarse de ninguna forma.

Archivos Unit — Definición de Servicios

Cada servicio está definido por un archivo de unidad (Unit File) con la extensión .service. Estos archivos especifican cómo Systemd debe gestionar el servicio: qué comando ejecutar, dependencias, dónde escribir logs, etc.

Ubicaciones de los archivos

Administrador del sistema
/etc/systemd/system/

Archivos creados o modificados por el administrador. Tienen prioridad sobre los de distribución.

Provistos por paquetes
/lib/systemd/system/

Archivos instalados por los paquetes de software del sistema. No se deben modificar directamente.

Explorar los archivos de unidad

bash
cd /etc/systemd/system/ && ls
cd /lib/systemd/system/ && ls
Captura — contenido de /lib/systemd/system/
Listado de archivos en /lib/systemd/system/

Recargar Systemd tras modificar un archivo

Si modificas un archivo de unidad, siempre debes notificar a Systemd para que relea los archivos antes de usar el servicio:

bash
sudo systemctl daemon-reload
⚠️ Importante: Si editas un .service en /etc/systemd/system/ o /lib/systemd/system/ y no ejecutas daemon-reload, Systemd seguirá usando la versión antigua del archivo en memoria. Siempre recarga antes de iniciar o reiniciar el servicio.

Ejercicio Práctico Final

Flujo completo que cubre monitoreo de procesos, señales y administración de servicios con systemctl.

🏋️ Ejercicio — Auditoría y Control de Servicios
PASO 1 — Ver todos los procesos del sistema
bash
ps aux | head -20
PASO 2 — Buscar el PID de un proceso específico
bash
pgrep -a firefox          # Muestra PID y nombre completo
ps aux | grep firefox
PASO 3 — Terminar un proceso elegantemente
bash
kill <PID>              # SIGTERM — elegante (reemplaza <PID> por el número real)
# Si no responde:
kill -9 <PID>          # SIGKILL — forzado
PASO 4 — Verificar el estado del servidor SSH
bash
systemctl status ssh
PASO 5 — Instalar Apache y habilitarlo en el arranque
bash
sudo apt install apache2
sudo systemctl enable --now apache2
systemctl status apache2
PASO 6 — Listar todos los servicios del sistema
bash
systemctl list-unit-files --type=service | grep enabled
PASO 7 — Deshabilitar un servicio innecesario
bash
sudo systemctl disable cups
systemctl is-enabled cups   # Verificar: debe mostrar "disabled"