Linux: "ps aux" explicado

Cuantas veces necesitamos obtener información sobre procesos y utilizamos la instrucción:

ps aux

ps aux explicado

Sin saber bien ¿qué hace?

ps se utiliza para obtener una instantánea de los procesos en el sistema. 

Muchas veces es necesario obtener información valiosa, como por ejemplo determinar bajo qué usuario corre un proceso, y utilizamos el viejo y conocido "ps aux" sin saber bien que opciones estamos utilizando.

Generalmente en cualquier distribución de GNU/Linux se incluye la versión de ps que acepta diferentes tipos de opciones: las opciones UNIX que son precedidas por un guión (dash), las opciones BSD que no utilizan guión, y las opciones GNU largas que se preceden por dos guiones. 

Estas opciones se pueden mezclar, pero a veces ocasionan conflictos o existen opciones sinónimas que producen los mismos resultados. Por ejemplo "ps -aux" muestra todos los procesos pertenecientes al usuario llamado "x", ya que no suele existir un usuario llamado "x" ps lo interpreta como el comando "ps aux" e imprime una advertencia :D

Por defecto ps sólo muestra los procesos con el mismo user id efectivo (EUID) que el del usuario que lo ejecuta. Cuando utilizamos ps con las opciones "aux" el resultado es:

a: eliminar la restricción BSD "only yourself" para agregar procesos de otros usuarios
u: utilizar el formato orientado al usuario
x: eliminar la restricción BSD "must have a tty" para agregar procesos que no tengan una tty asociada

De esta forma seleccionamos todos los procesos en el sistema y los mostramos en el formato orientado al usuario.

La salida de "ps aux" es una tabla donde cada fila es un proceso y las columnas contienen la siguiente información:

USER: usuario con el que se ejecuta el proceso
PID: ID del proceso
%CPU: porcentaje de tiempo que el proceso estuvo en ejecución desde que se inició
%MEM: porcentaje de memoria física utilizada
VSZ: memoria virtual del proceso medida en KiB
RSS: "resident set size", es la cantidad de memoria física no swappeada que la tarea a utilizado (en KiB)
TT: terminal que controla el proceso (tty)
STAT: código de estado del proceso (información detallada más adelante)
STARTED: fecha de inicio del proceso
TIME: tiempo de CPU acumulado
COMMAND: comando con todos sus argumentos

Los códigos de estado del proceso pueden ser:

D: suspendido no interrumpible (generalmente esperando E/S)
R: en ejecución o listo para ejecutarse (en cola)
S: suspendido interrumpible (esperando que se complete un evento)
T: detenido, por una señal de control de trabajo o porque está siendo traceado
W: paginado (no válido a partir del kernel 2.6.xx)
X: muerto (nunca debe ser visto)
Z: proceso difunto ("zombie"), terminado pero no reclamado por el proceso padre

Para los formatos BSD (por ejemplo como cuando se utiliza "ps axo" para mostrar la lista de procesos en un formato definido por el usuario) y cuando se utiliza la palabra clave "stat", se muestran los caracteres adicionales:

<: alta prioridad
N: baja prioridad
L: tiene páginas bloqueadas en memoria
s: es un líder de sesión (se trata de un proceso que ha iniciado una nueva sesión)
l: es multihilado
+: está en el grupo de procesos en primer plano

Por ejemplo: 

$ ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

Algunos ejemplos útiles que se incluyen en el manual de ps son:

Ver todos los procesos en el sistema utilizando la sintaxis estándar:

ps -e
ps -ef
ps -eF
ps -ely


Imprimir un árbol de procesos:

ps -ejH
ps axjf


Obtener información de hilos:

ps -eLf
ps axms


Obtener información de seguridad:

ps -eo euser,ruser,suser,fuser,f,comm,label
ps axZ
ps -eM


Ver todos los procesos ejecutando como root (ID efectivo y real) en formato de usuario:

ps -U root -u root u

Entre muchas opciones que tiene ps, es posible ordenar la salida de acuerdo a una columna, para esto se debe utilizar la opción gnu larga "--sort", por ejemplo para ordenar por tiempo de CPU (si deseamos determinar qué proceso ha utilizado más CPU) seleccionamos el código "cputime", correspondiente a la columna TIME:

ps aux --sort cputime

Es posible alterar el comportamiento de ps utilizando variables de entorno, la más significativa es "PS_PERSONALITY" la cual afecta la "personalidad" de ps. Se puede setear "PS_PERSONALITY" utilizando export y observar los resultados, por ejemplo:

# export PS_PERSONALITY=bsd
# ps
  PID TTY      STAT   TIME COMMAND
  675 tty4     Ss+    0:00 /sbin/getty -8 38400 tty4
  680 tty5     Ss+    0:00 /sbin/getty -8 38400 tty5
  685 tty2     Ss+    0:00 /sbin/getty -8 38400 tty2
  687 tty3     Ss+    0:00 /sbin/getty -8 38400 tty3
  692 tty6     Ss+    0:00 /sbin/getty -8 38400 tty6
  893 tty1     Ss+    0:00 /sbin/getty -8 38400 tty1
17774 pts/1    S      0:00 su
17775 pts/1    S      0:00 bash
18064 pts/1    R+     0:00 ps
# export PS_PERSONALITY=linux
# ps
  PID TTY          TIME CMD
17774 pts/1    00:00:00 su
17775 pts/1    00:00:00 bash
18065 pts/1    00:00:00 ps


En el manual de ps se explican los diferentes valores que puede tomar la variable de entorno PS_PERSONALITY:

man ps

A jugar con ps!!!

El autor de este post es: Emiliano Marini

No hay comentarios:

Publicar un comentario