El proceso es una instancia en ejecución de un programa. Linux es un sistema operativo multitarea, lo que significa que más de un proceso puede estar activo a la vez. Utilice el comando ps para averiguar qué procesos se están ejecutando en su sistema.
Este artículo explica 7 usos prácticos del comando ps y sus opciones.
Para monitorear y controlar los procesos, Linux proporciona muchos comandos como ps, kill, killall, nice, renice y top.
1. Lista de procesos actualmente en ejecución (ps -ef, ps -aux)
Es un ejemplo de uso común con un comando ps para enumerar todos los procesos que se están ejecutando actualmente en una máquina. El siguiente ejemplo muestra las opciones del comando ps para obtener todos los procesos.
$ ps -ef root 26551 5 0 Feb10 ? 00:03:41 [pdflush] root 26570 5 0 Feb10 ? 00:00:20 [pdflush] root 30344 3382 0 Feb21 ? 00:00:11 sshd: root@pts/14 root 30365 30344 0 Feb21 pts/14 00:00:02 -bash root 30393 3382 0 Feb21 ? 00:00:10 sshd: root@pts/15
donde:
- -e para mostrar todos los procesos.
- -f para mostrar la lista de formato completo.
En el caso de las máquinas BSD, puede usar 'ps -aux' para obtener detalles sobre todo el proceso como se muestra arriba.
$ ps -aux
2. Enumere el proceso según el UID y los comandos (ps -u, ps -C)
Use la opción -u para mostrar el proceso que pertenece a un nombre de usuario específico. Cuando tenga varios nombres de usuario, sepárelos con una coma. El siguiente ejemplo muestra todos los procesos que son propiedad del usuario wwwrun o postfix.
$ ps -f -u wwwrun,postfix UID PID PPID C STIME TTY TIME CMD postfix 7457 7435 0 Mar09 ? 00:00:00 qmgr -l -t fifo -u wwwrun 7495 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 7496 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 7497 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 7498 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 7499 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 10078 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf wwwrun 10082 7491 0 Mar09 ? 00:00:00 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf postfix 15677 7435 0 22:23 ? 00:00:00 pickup -l -t fifo -u
A menudo, ps se usa con grep como “ps -aux | comando grep” para obtener la lista de procesos con el comando dado.
Pero el comando ps en sí tiene una opción para lograr lo mismo. El siguiente ejemplo muestra que todos los procesos que tienen tatad.pl en su ejecución de comandos.
$ ps -f -C tatad.pl UID PID PPID C STIME TTY TIME CMD root 9576 1 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9577 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9579 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9580 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9581 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9582 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 12133 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl
3. Enumere los procesos basados en PID o PPID (ps -p, ps –ppid)
A cada proceso se le asignará una ID de proceso (PID) única.
Cuando inicia alguna aplicación, puede bifurcar una cantidad de procesos y cada subproceso tendrá su propio PID. Por lo tanto, cada proceso tendrá su propia identificación de proceso y su propia identificación de proceso principal.
Para todos los procesos que un proceso bifurca tendrán el mismo PPID (identificador de proceso principal). El siguiente método se utiliza para obtener una lista de procesos con un PPID particular.
$ ps -f --ppid 9576 UID PID PPID C STIME TTY TIME CMD root 9577 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9579 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9580 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9581 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 9582 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl root 12133 9576 0 Mar09 ? 00:00:00 /opt/tata/perl/bin/perl /opt/tata/bin/tatad.pl
El siguiente ejemplo es para listar los procesos que han dado PID.
$ ps -f -p 25009,7258,2426 UID PID PPID C STIME TTY TIME CMD root 2426 4 0 Mar09 ? 00:00:00 [reiserfs/0] root 7258 1 0 Mar09 ? 00:00:00 /usr/sbin/nscd postfix 25009 7435 0 00:02 ? 00:00:00 pickup -l -t fifo -u
4. Listar Procesos en una Jerarquía (ps –forest)
El siguiente ejemplo muestra el Id. del proceso y los comandos en una jerarquía. –forest es un argumento para el comando ps que muestra el arte ASCII del árbol de procesos. A partir de este árbol, podemos identificar cuál es el proceso padre y el hijo lo procesa bifurcado de manera recursiva.
$ ps -e -o pid,args --forest 468 \_ sshd: root@pts/7 514 | \_ -bash 17484 \_ sshd: root@pts/11 17513 | \_ -bash 24004 | \_ vi ./790310__11117/journal 15513 \_ sshd: root@pts/1 15522 | \_ -bash 4280 \_ sshd: root@pts/5 4302 | \_ -bash
5. Muestra el tiempo de pared transcurrido para los procesos (ps -o pid,etime=)
Si desea obtener el tiempo transcurrido para los procesos que se están ejecutando actualmente, el comando ps proporciona etime, que proporciona el tiempo transcurrido desde que se inició el proceso, en la forma [[dd-]hh:]mm:ss.
El siguiente comando muestra el tiempo transcurrido para los ID de proceso 1 (init) y el ID de proceso 29675.
Por ejemplo, "10-22:13:29" en la salida representa el proceso que se está ejecutando durante 10 días, 22 horas, 13 minutos y 29 segundos. Dado que el proceso de inicio comienza durante el inicio del sistema, esta vez será la misma que la salida del comando 'uptime'.
# ps -p 1,29675 -o pid,etime= PID 1 10-22:13:29 29675 1-02:58:46
6. Listar todos los subprocesos para un proceso en particular (ps -L)
Puede obtener una lista de subprocesos para los procesos. Cuando un proceso se bloquea, es posible que necesitemos identificar la lista de subprocesos que se ejecutan para un proceso en particular, como se muestra a continuación.
$ ps -C java -L -o pid,tid,pcpu,state,nlwp,args PID TID %CPU S NLWP COMMAND 16992 16992 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16993 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16994 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16995 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16996 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16997 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16998 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 16999 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 17000 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 17001 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 17002 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 17003 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 17024 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 15753 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006 16992 15754 0.0 S 15 ../jre/bin/java -Djava.ext.dirs=../jre/lib/ext:../lib:../auto_lib -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5006
La opción -L se usa para mostrar la lista de subprocesos para un proceso que tiene el comando dado. Y también muestra nlwp, que representa el número de procesos ligeros. En el ejemplo anterior, se están ejecutando un total de 15 subprocesos Java.
7. Búsqueda de fugas de memoria (ps –sort pmem)
Una fuga de memoria, técnicamente, es un uso cada vez mayor de la memoria por parte de una aplicación.
Con las aplicaciones de escritorio comunes, esto puede pasar desapercibido, porque un proceso generalmente libera la memoria que ha usado cuando cierra la aplicación.
Sin embargo, en el modelo cliente/servidor, la fuga de memoria es un problema grave, ya que se espera que las aplicaciones estén disponibles las 24 horas del día, los 7 días de la semana. Las aplicaciones no deben continuar aumentando su uso de memoria indefinidamente, ya que esto puede causar problemas graves. Para monitorear tales pérdidas de memoria, podemos usar los siguientes comandos.
$ ps aux --sort pmem USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 1520 508 ? S 2005 1:27 init inst 1309 0.0 0.4 344308 33048 ? S 2005 1:55 agnt (idle) inst 2919 0.0 0.4 345580 37368 ? S 2005 20:02 agnt (idle) inst 24594 0.0 0.4 345068 36960 ? S 2005 15:45 agnt (idle) root 27645 0.0 14.4 1231288 1183976 ? S 2005 3:01 /TaskServer/bin/./wrapper-linux-x86-32
En el comando ps anterior, la opción –sort genera el %MEM más alto en la parte inferior. Simplemente anote el PID para el mayor uso de %MEM. Luego use el comando ps para ver todos los detalles sobre esta identificación de proceso y monitorear el cambio a lo largo del tiempo. Tenías que repetirlo manualmente o ponerlo como cron en un archivo.
$ ps ev --pid=27645 PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND 27645 ? S 3:01 0 25 1231262 1183976 14.4 /TaskServer/bin/./wrapper-linux-x86-32 $ ps ev --pid=27645 PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND 27645 ? S 3:01 0 25 1231262 1183976 14.4 /TaskServer/bin/./wrapper-linux-x86-32
Artículos anteriores de la serie de supervisión y ajuste del rendimiento de Linux:
- 10 ejemplos útiles de Sar (Sysstat) para la supervisión del rendimiento de UNIX/Linux
- Introducción a la supervisión y ajuste del rendimiento de Linux
- 15 ejemplos prácticos de comandos superiores de Linux