← Blog

Administración de Procesos en Linux

Gestión de procesos en Linux: ps/top/pstree, prioridades nice, /proc, señales, jobs y programación con cron.

Administración de Procesos en Linux

Operational Scope & Technical Objective

Un proceso es una instancia en ejecución de un programa identificada por un PID; sobre ella operan dos primitivas de control: la prioridad (nice value, rango -20 … 19, donde -20 es la máxima prioridad y 19 la mínima) y las señales (kill, que implementa el envío de SIGTERM/SIGKILL/SIGHUP/SIGSTOP, entre otras). El kernel expone además el pseudo-filesystem /proc/<pid>/, que permite inspeccionar el estado de cada proceso sin privilegios elevados. La inspección dinámica se apoya en strace (system calls) y ltrace (library calls), y la programación de tareas repetidas en cron/anacron.

High-Impact Syntax & Command Cheatsheet

Información de procesos

# Sintaxis BSD: todos los procesos, formato usuario, sin terminal
ps aux          # a=all, u=usuario, x=procesos sin tty asociada

# Sintaxis estándar (SysV)
ps -ef          # snapshot completo
ps -eF          # igual, con formato extendido (strace-friendly)
ps -eH          # -e procesos de todos los usuarios, -H jerárquico

# Vista dinámica en tiempo real
top

# Árbol de relaciones padre/hijo
pstree -capl
pstree         # vista simplificada de la jerarquía

Prioridad (scheduling)

nice -n -20 <command>   # arranca el comando con prioridad -20 (máxima)
renice <nice-value> <pid>  # reajusta la prioridad de un proceso en marcha

Mapa de memoria de un proceso

cat /proc/1234/maps      # rangos de memoria mapeados por el PID 1234
pmap -d 1234             # resumen del mapa de memoria
# gdb: info proc mappings

Pseudo-filesystem /proc

/proc/<pid>/environ   # variables de entorno del proceso
/proc/<pid>/cmdline   # línea de comando con la que se lanzó
/proc/<pid>/maps      # mapa de memoria
/proc/<pid>/fd        # file descriptors abiertos

Trazado de llamadas

strace -p <pid>       # sigue system calls de un proceso vivo
ltrace -p <pid>       # sigue library calls (libc, etc.)

Control del proceso

killall <name>      # SIGTERM a todas las instancias del programa
kill <pid>          # SIGTERM (por defecto)
kill -9 <pid>       # SIGKILL, incondicional
pkill xeyes         # mata cualquier proceso que coincida con el criterio
kill -l             # lista completa de señales disponibles

Signals clave

Señal Uso
SIGHUP Indica al proceso que debe recargar su configuración
SIGSTOP Detiene la ejecución (equivale a Ctrl+Z)
SIGTERM Señal por defecto de kill; terminación limpia
SIGKILL Terminación forzosa; usada cuando SIGTERM no responde

Estados de proceso

  • Running — la CPU está ejecutando el proceso.
  • Sleeping — espera un recurso; al obtenerlo vuelve a running.
  • Stopped — se le envió SIGSTOP; la CPU deja de ejecutarlo.
  • Terminated — el proceso ha muerto.
  • Zombie — restos de un proceso muerto sin recoger por su padre; no responde a señales normales de terminación.

Foreground, background y jobs

xeyes            # proceso en primer plano; bloquea el shell
xeyes &          # proceso en segundo plano; devuelve PID

# Ctrl+Z           suspende el proceso en primer plano
jobs             # lista procesos suspendidos/en background
bg               # reanuda el último job en background
fg               # trae el job al foreground
fg %1 / bg %1    # con job id explícito si hay varios

Programación de tareas (cron)

less /etc/crontab    # tareas programadas a nivel de sistema
crontab -e           # crontab personal del usuario
crontab -l           # imprime el contenido del crontab
crontab -r           # elimina todos los cronjobs del usuario

Formato: m h dom mon dow command

5 1 2 * * touch /home/bob/cron/crontab-ran.txt    # 01:05 cada día 2 del mes
*/5 * * * * touch /home/bob/cron/crontab-ran.txt  # cada 5 minutos

SysV init (arranque):

ls -la /etc/init.d    # scripts de arranque del sistema
ls -la /etc/rc*.d     # runlevels y enlaces a los scripts

Real-World Offensive/Defensive Scenarios

  • Detección de procesos que corren como root (ofensivo): correlacionar ps aux | grep root con cronjobs permite atacar scripts periódicos escritos en rutas que el usuario puede modificar (PATH hijacking o sobrescritura directa).

    ps aux | grep root
    
  • Monitoreo de actividad periódica: cuando no se dispone de pspy, un bucle de muestreo de la tabla de procesos revela tareas que se ejecutan cada 1, 2 o 5 minutos:

    for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; \
      sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | \
      sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp
    
  • Harvesting de credenciales desde /proc (ofensivo): /proc/<pid>/environ de un servicio expone variables de entorno (claves, tokens) con solo permiso de lectura sobre el proceso.

  • Verificación de ACLs en runtime (defensivo): la syscall access(2) comprueba permisos usando el real UID/GID del proceso llamante, no los effective IDs como open(2); conviene tenerlo presente al auditar binarios SUID, donde EUID y RUID divergen.