Ghost AcademySecLearn// Seguridad Informática
⚙️ Linux · Procesos · Gestión del Sistema
Procesos y Gestión
del Sistema

Comandos esenciales para monitorear, controlar y gestionar procesos en Linux: desde ps y top hasta kill, nice y xargs.

pstophtop killkillalljobs fgbgnice renicexargs

Procesos y Gestión del Sistema

Estos comandos te permiten ver qué está haciendo tu sistema, cómo se utilizan los recursos, y tomar el control sobre los procesos en ejecución: detenerlos, reanudarlos, ajustar su prioridad o terminarlos.

ps — Instantánea de Procesos

El comando ps (process status) muestra los procesos que se están ejecutando en el momento exacto en que se invoca. A diferencia de top, es una foto fija, no una vista dinámica.

Opciones principales

OpciónDescripción
auxMuestra todos los procesos (a), incluyendo los sin terminal (x), con formato de usuario (u). El más usado.
efMuestra todos los procesos (e) con formato completo (f). Útil para ver la línea de comandos completa y la jerarquía.
-u usuarioFiltra los procesos de un usuario específico.
-ejHMuestra los procesos en formato árbol (Hierarchy).

Ejemplo — Ver procesos del usuario jose

bash
ps aux | grep jose
Salida
USER   PID  %CPU %MEM    VSZ   RSS TTY   STAT START   TIME COMMAND
jose  1234   0.0  0.1 123456  4568 ?     Ss   07:08   0:00 /usr/bin/gnome-shell
jose  5678   0.0  0.0  12300  1024 pts/0 R+   07:08   0:00 grep --color=auto jose

Ejemplo — Ver jerarquía (árbol) de procesos

bash
ps ef
Salida — Árbol de procesos
UID    PID  PPID C STIME TTY     TIME CMD
root   654     2 0 07:05 ?   00:00:00 /usr/lib/systemd/systemd --user
jose  1234   654 0 07:06 ?   00:00:01  \_ /usr/bin/gnome-shell

Buscar un proceso específico

bash
ps aux | grep python      # Buscar procesos Python
ps -ejH                   # Árbol completo del sistema

top — Monitor Dinámico en Tiempo Real

El comando top proporciona una vista dinámica y continua de la actividad del sistema, incluyendo el uso de CPU, memoria y los procesos que más consumen recursos. Se actualiza automáticamente cada pocos segundos.

bash
top                 # Vista general
top -u jose         # Filtrar por usuario

Controles interactivos dentro de top

TeclaAcción
POrdenar por uso de CPU (predeterminado)
MOrdenar por uso de Memoria
kKill — terminar un proceso (pide el PID)
rRenice — cambiar la prioridad de un proceso
qSalir de top

htop — Monitor Interactivo Mejorado

htop es una alternativa a top más moderna y visualmente amigable. Permite desplazarse horizontal y verticalmente e interactuar con los procesos de forma más intuitiva.

bash — Instalación (si no está disponible)
sudo apt install htop
bash
htop

Ventajas sobre top y controles

TeclaAcción
F6Ordenar los procesos por cualquier columna
F9Enviar señal de terminación (kill) al proceso seleccionado
F10 / qSalir de htop
↑ ↓ ← →Navegar por la lista de procesos
💡 Ventajas clave: Interfaz colorida, barras de CPU y Memoria visibles en la parte superior, muestra CPU por núcleo individual, y navegación intuitiva con teclado.

jobs — Listar Trabajos de la Sesión

El comando jobs muestra una lista de los trabajos (comandos) que están actualmente activos y asociados a tu sesión de terminal. Es el punto de partida para gestionar procesos con fg y bg.

Crear trabajos de ejemplo

PASO 1 — Iniciar un proceso en segundo plano con &
bash
sleep 3600 &
Salida
[1] 12345
  ↑ Job ID    ↑ PID del proceso
PASO 2 — Iniciar un proceso interactivo y suspenderlo (Ctrl+Z)
bash
nano prueba.txt
# Una vez dentro de nano: presiona Ctrl+Z para suspender
Salida al suspender con Ctrl+Z
^Z
[2]+ Stopped   nano prueba.txt
PASO 3 — Ver todos los trabajos activos
bash
jobs
Salida típica
[1]- Running    sleep 3600 &
[2]+ Stopped    nano prueba.txt
ℹ️ Símbolo + y -: El + indica el trabajo actual (usado por defecto si no especificas número). El - es el trabajo anterior. Los comandos fg y bg sin argumento actúan sobre el trabajo +.

Comandos de gestión de trabajos

ComandoAcción
fg %NTrae el trabajo N al primer plano (foreground)
bg %NReanuda el trabajo N en segundo plano (background)
kill %NTermina el trabajo N por su Job ID
comando &Inicia un comando directamente en segundo plano
Ctrl+ZSuspende el proceso activo y lo añade a la lista de jobs

fg — Traer un Trabajo a Primer Plano

El comando fg (foreground) trae un trabajo que está detenido o en segundo plano de vuelta al primer plano, permitiéndote interactuar con él directamente en la terminal.

bash
jobs
# [1]- Running    sleep 60 &
# [2]+ Stopped    nano ejemplo.txt

fg %2   # Trae nano al primer plano para seguir editando
Resultado
(Se abre el editor nano para continuar editando el archivo.)

bg — Reanudar un Trabajo en Segundo Plano

El comando bg (background) reanuda un trabajo detenido y lo mueve para que se ejecute en segundo plano, liberando la terminal.

bash
jobs
# [1]- Running    sleep 60 &
# [2]+ Stopped    nano ejemplo.txt

bg %2   # Intenta reanudar nano en segundo plano
Salida tras bg %2
[2]+ nano ejemplo.txt &

jobs
[1]- Running    sleep 60 &
[2]+ Stopped    nano ejemplo.txt   ← ¡Sigue detenido!
⚠️ ¿Por qué nano sigue detenido? nano es un editor interactivo: necesita leer del teclado y escribir en la terminal (TTY). Cuando está en segundo plano e intenta acceder al terminal, el kernel le envía automáticamente la señal SIGTTIN o SIGTTOU y lo detiene de nuevo. bg solo es útil para procesos no interactivos (como sleep, scripts, compilaciones…).
💡 Regla práctica: Para programas interactivos como nano, vim o less, siempre usa fg %N para volver a trabajar con ellos. bg es para procesos que pueden ejecutarse sin la terminal.

kill — Enviar Señales a un Proceso por PID

El comando kill envía una señal a un proceso identificado por su PID. La señal más común es SIGTERM (terminación elegante) pero puede enviar cualquier señal del sistema.

Señales principales

kill -15 (SIGTERM)
NombreSignal Termination
ComportamientoElegante / Cortés
El proceso puedeCapturar e ignorar
Limpieza de datosSí — guarda y cierra
Uso recomendadoSiempre intentar primero
kill -9 (SIGKILL)
NombreSignal Kill
ComportamientoForzado / Brutal
El proceso puedeNo puede bloquearla
Limpieza de datosNo — puede corromper
Uso recomendadoSolo si -15 no funciona

Ejemplo — Terminación elegante (SIGTERM)

bash
sleep 1000 &
# [1] 12345

kill 12345        # Envía SIGTERM (señal 15 por defecto)
Salida
[1]+ Terminated   sleep 1000

Ejemplo — Terminación forzada (SIGKILL)

bash
sleep 1000 &
# [1] 12346

kill -9 12346     # Si el proceso no responde a SIGTERM
Salida
[1]+ Killed   sleep 1000
⚠️ Orden recomendado: Intenta siempre kill PID primero (SIGTERM). Solo usa kill -9 PID si el proceso está colgado o ignora la señal de terminación. El -9 puede dejar datos inconsistentes o archivos incompletos.

killall — Enviar Señales por Nombre de Proceso

El comando killall es útil para terminar todos los procesos que coinciden con un nombre de comando específico, sin necesidad de conocer sus PIDs.

bash — Terminar todas las instancias de gedit
killall gedit
bash — Terminación forzada de firefox
killall -9 firefox

Ejemplo práctico con gedit (paso a paso)

PASO 1 — Instalar y abrir múltiples instancias
bash
sudo apt install gedit
gedit archivo1.txt &
gedit archivo2.txt &
gedit archivo3.txt &
PASO 2 — Verificar que los procesos existen
bash
pgrep gedit
Salida — PIDs de las instancias abiertas
2341
2358
2372
PASO 3 — Terminar todos los procesos gedit
bash
killall gedit
PASO 4 — Verificar que no quedan procesos
bash
pgrep gedit
Salida — Sin output = éxito
(sin salida — no hay procesos gedit en ejecución)

[2]+ Terminado   gedit archivo1.txt   ← Notificación del shell
ℹ️ Notificación del shell: El mensaje [2]+ Terminado gedit archivo1.txt no es la salida de pgrep, sino una notificación que Bash emite cuando detecta que un trabajo en segundo plano ha finalizado.

nice — Ejecutar con Prioridad Modificada

El comando nice inicia un nuevo proceso con una prioridad diferente a la predeterminada. La prioridad se mide con el valor niceness.

-20
Máx. prioridad
-10
Alta
0
Defecto
10
Baja
19
Mín. prioridad
  • -20: Máxima prioridad (menos "nice" con el resto del sistema). Requiere root.
  • 0: Prioridad por defecto para procesos de usuario.
  • 19: Mínima prioridad — solo usa CPU cuando nadie más la necesita.
  • Sin sudo: Un usuario regular solo puede aumentar el valor (bajar prioridad), no reducirlo por debajo de 0.

Ejemplo — Backup con baja prioridad

bash
# El proceso tar solo usará CPU cuando otros procesos lo permitan
nice -n 15 tar -czf /tmp/backup_jose.tar.gz /home/jose/Documentos
bash
# Ejecutar script Python con baja prioridad
nice -n 10 python3 /home/jose/script_lento.py

renice — Cambiar Prioridad de un Proceso en Ejecución

A diferencia de nice, que actúa al lanzar un proceso, renice modifica el valor de niceness de un proceso que ya está en marcha.

bash
sleep 3600 &
# [1] 12347

renice 10 -p 12347   # Bajar la prioridad del proceso
Salida
12347 (process ID) old priority 0, new priority 10
bash — Con sudo (para subir prioridad)
sudo renice -n 5 -p 1234

xargs — Construir y Ejecutar Líneas de Comandos

El comando xargs toma la salida estándar de otro comando (generalmente via pipe |) y la utiliza para construir y ejecutar líneas de comando. Es esencial para trabajar con grandes listas de archivos.

Opciones principales

OpciónDescripción
-I {}Define un marcador de posición {} para insertar cada línea de entrada en una posición específica del comando.
-pPide confirmación antes de ejecutar cada comando (modo interactivo seguro).
-0Usar junto con find -print0 para manejar nombres de archivo con espacios o caracteres especiales.

Ejemplo — Eliminar archivos .bak encontrados por find

PASO 1 — Crear archivos .bak de prueba
bash
touch /home/jose/config.bak
echo "Contenido de backup" > /home/jose/doc_viejo.bak
PASO 2 — Verificar los archivos
bash
ls /home/jose/*.bak
Salida
/home/jose/config.bak   /home/jose/doc_viejo.bak
PASO 3 — Buscar y eliminar con find + xargs
bash
find /home/jose -name "*.bak" | xargs rm
ℹ️ Cómo funciona el pipe: find genera la lista de archivos → | envía esa lista a xargs → xargs ejecuta rm con cada archivo como argumento. Es equivalente a rm /home/jose/config.bak /home/jose/doc_viejo.bak.

Ejemplo — Copia interactiva y segura con -print0

bash
# -print0 y -0 manejan correctamente nombres con espacios
# -I {} inserta el nombre del archivo donde está {}
# -p pide confirmación antes de cada copia
find . -name "*.png" -print0 | xargs -0 -I {} -p cp {} /tmp/imagenes_jose
Interacción
cp ./foto1.png /tmp/imagenes_jose? ...y/n/...

Más ejemplos prácticos

bash
# Contar líneas de todos los .txt
find /home/jose/ -name "*.txt" | xargs wc -l

# Eliminar logs antiguos
find /home/jose/temp -name "*.log" | xargs rm

# Abrir los 3 primeros PDFs encontrados
locate "*.pdf" | head -n 3 | xargs xdg-open

Referencia Rápida — Índice de Comandos

ComandoSintaxis básicaUso típico
ps auxps aux | grep usuarioVer todos los procesos del sistema
ps efps efVer árbol jerárquico de procesos
toptop -u joseMonitor en tiempo real filtrado por usuario
htophtopMonitor visual interactivo
jobsjobsListar trabajos de la sesión actual
fg %Nfg %2Traer trabajo N al primer plano
bg %Nbg %1Reanudar trabajo N en segundo plano
kill PIDkill 12345SIGTERM — terminación elegante
kill -9 PIDkill -9 12345SIGKILL — terminación forzada
killall nombrekillall firefoxTerminar todos los procesos por nombre
nice -n N cmdnice -n 15 tar -czf ...Iniciar proceso con prioridad reducida
renice N -p PIDrenice 10 -p 12347Cambiar prioridad de proceso en marcha
xargsfind ... | xargs rmEjecutar comandos con lista de argumentos

Ejercicio Práctico Final

Flujo completo que cubre monitoreo, gestión de trabajos, señalización y prioridad de procesos.

🏋️ Ejercicio — Gestión completa de procesos Python
PASO 1 — Ver todos los procesos del sistema
bash
ps aux | grep python
PASO 2 — Ejecutar un script con baja prioridad en segundo plano
bash
nice -n 15 python3 largo.py &
PASO 3 — Ver los trabajos activos en la sesión
bash
jobs
PASO 4 — Traer el trabajo al primer plano si es necesario
bash
fg %1
PASO 5 — Si usa demasiada CPU, terminar por PID
bash
# Encontrar el PID primero
ps aux | grep python

# Terminar elegantemente
kill 12345

# Si no responde, forzar
kill -9 12345
PASO 6 — Limpiar archivos .log de una carpeta temporal
bash
find /home/jose/temp -name "*.log" | xargs rm