Gestión de procesos y trabajos.

Autor: Joel Barrios Dueñas
Correo electrónico: darkshram en gmail punto com
Sitio de Red: http://www.alcancelibre.org/
Jabber ID: darkshram@jabber.org

Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1

© 1999-2015 Joel Barrios Dueñas. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector, hace mal uso de éstos.

Introducción.

En este documento aprenderá el uso de free, jobs, bg, fg, kill, killall, ps, top y taskset.

Un PID o identidad de proceso, es un decimal entero que especifica un proceso o un grupo de procesos. Todos los procesos que se ejecuten en un sistema pueden ser terminados o aniquilados utilizando kill o bien killall, excepto por el proceso con PID 1, el cual corresponde siempre a /sbin/init.

Un Job ID o identidad de trabajo, identifica un trabajo o grupo de trabajos que se ejecutan en segundo plano. Puede utilizar kill para terminar o aniquilar los trabajos originados de una misma consola o intérprete de mandatos en ejecución.

Los trabajos se gestionan a través de bg, fg y jobs.

Los procesos se terminan normalmente con SIGTERM (número de señal 15) o bien se aniquilan con SIGKILL (número de señal 9), utilizando kill o killall.

Procedimientos.

Ingrese al sistema como root.

Si utiliza CentOS 7, Fedora™ o Red Hat™ Enterprise Linux 7, ejecute lo siguiente:

yum -y install psmisc procps-ng top util-linux-ng

Si utiliza ALDOS 1.4, CentOS 6 o Red Hat™ Enterprise Linux 6, ejecute lo siguiente:

yum -y install psmisc procps top util-linux-ng

Si utiliza openSUSE™ o SUSE™ Linux Enterprise, ejecute lo siguiente:

yast -i procps psmisc util-linux

Cierre la sesión como root e ingrese nuevamente al sistema como usuario regular (fulano) o bien ejecute lo siguiente:

su -l fulano

Uso de free.

Se trata de una herramienta que muestra un resumen fácil de entender del contenido de /proc/meminfo. Muestra la cantidad de memoria utilizadas y disponible en el sistema.

De modo predeterminado free muestra la información en escala de KiB. Ejecute lo siguiente:

free

Lo anterior debe devolver una salida similar a la siguiente:

             total       used       free     shared    buffers     cached
Mem:       2956352    2752032     204320          0     159592    1509388
-/+ buffers/cache:    1083052    1873300
Swap:      6291448     167468    6123980

Ejecute lo siguiente para ver la la salida en MiB:

free -m

Lo anterior debe devolver una salida similar a la siguiente.

             total       used       free     shared    buffers     cached
Mem:          2887       2712        174          0        156       1487
-/+ buffers/cache:       1068       1818
Swap:         6143        163       5980

La interpretación de ésta última salida indica lo siguiente:

Ejecute lo siguiente para mostrar lo anterior con una fila con los totales en MiB:

free -mt

Lo anterior debe devolver una salida similar a la siguiente.

             total       used       free     shared    buffers     cached
Mem:          2887       2712        174          0        156       1487
-/+ buffers/cache:       1068       1818
Swap:         6143        163       5980
Total:        9031       2876       6154

Puede consultar otras opciones de free a través de su página de manual ejecutando lo siguiente:

man 1 free

Uso de jobs, bg y fg.

Ejecute sleep con el valor 600 (pausa por 600 segundos), a fin de utilizar éste como trabajo de ejemplo.

sleep 600

Pulse CTRL+Z, lo cual devolverá una salida similar a la siguiente:

^Z
[1]+  Detenido                sleep 600

Ejecute jobs para visualizar el trabajo detenido:

jobs

Lo anterior debe devolver la siguiente salida:

[1]+  Detenido                sleep 600

Ejecute bg para reactivar el trabajo 1 en segundo plano:

bg 1

La salida deberá devolver lo siguiente:

[1]+ sleep 600 &

Ejecute nuevamente sleep, con el valor 700 y un signo amperson (&) al final:

sleep 700 &

La salida devolverá algo similar a lo siguiente, indicando el número de trabajo (2) y el número de identidad de proceso (PID):

[2] 3768

Con lo anterior habrá enviado este trabajo directamente a segundo plano.

Ejecute jobs para visualizar los trabajos en segundo plano:

[1]-  Ejecutando              sleep 600 &
[2]+  Ejecutando              sleep 700 &

Ejecute fg con 1 como argumento para enviar a primer plano el primer trabajo:

fg 1

Lo anterior hará que sleep 600 regrese a primer plano.

Para terminar este último trabajo, pulse CTRL+C.

Uso de ps, kill y killall.

Ejecute ps con las opciones aux (todos los procesos en todas las terminales, orientado a usuarios e incluyendo todos los procesos con o sin un TTY), utilizando una tubería (|) con less para poder observar cómodamente la salida y los valores de las columnas USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME y COMMAND.

ps aux |less

Ejecute de nuevo lo anterior pero utilizando una tubería (|) y grep para visualizar solamente los procesos cuyo nombre incluyan la cadena sleep:

ps aux |grep sleep

Lo anterior le devolverá una salida similar a la siguiente:

fulano  3768  0.0  0.0 100984   568 pts/2    S    11:50   0:00 sleep 700
fulano  3820  0.0  0.0 103396   832 pts/2    S+   11:51   0:00 grep --color=auto sleep

La segunda columna corresponde al número de identidad de proceso (PID), determine el correspondiente al procesos sleep 700.

ejecute kill con este número de identidad de proceso, con la finalidad terminar éste de manera normal (SIGTERM).

kill 3768

Lo anterior devolverá la siguiente salida:

[2]+  Terminado               sleep 700

Ejecute de nuevo sleep, ahora con 800 como argumento, con un signo amperson (&) al final, a fin de generar un nuevo trabajo en segundo plano.

sleep 800 &

Lo anterior debe devolver una salida similar a la siguiente:

[1] 3820

La forma más sencilla de terminar de manera normal (SIGTERM) un trabajo es ejecutando kill con el número de trabajo precedido por un signo %, como argumentos. Ejemplo:

kill %1

La salida solo devolverá el símbolo de sistema. Si vuelve a pulsar la tecla ENTER, la salida será similar a la siguiente:

[1]+  Terminado               sleep 800

Ejecute de nuevo sleep con 850 como argumento y un signo amperson (&) al final para generar un nuevo trabajo en segundo plano.

sleep 850 &

Lo anterior debe devolver una salida similar a la siguiente:

[1] 3830

Ejecute nuevamente ps con las opciones aux, agregando una tubería y grep para visualizar en la salida solamente los procesos cuyo nombre incluyan la cadena sleep:

ps aux |grep sleep

Lo anterior le devolverá una salida similar a la siguiente:

fulano  3830  0.0  0.0 100984   564 pts/2    S    11:54   0:00 sleep 850
fulano  3835  0.0  0.0 103396   828 pts/2    S+   11:56   0:00 grep --color=auto sleep

Determine el número de identidad de proceso correspondiente al procesos sleep 850.

Ejecute kill con este número de identidad de proceso, correspondiente a sleep 850, con la finalidad aniquilar éste (SIGKILL).

kill -9 3830

Lo anterior debe devolver la siguiente salida:

[1]+  Terminado (killed)      sleep 850

Ejecute lo siguiente para generar dos nuevos trabajos en segundo plano:

sleep 600 & sleep 700 &

Lo anterior devolverá algo similar a lo siguiente:

[1] 3924
[2] 3925

Ejecute jobs para visualizar ambos trabajos:

jobs

Lo anterior deberá devolver la siguiente salida:

[1]-  Ejecutando              sleep 600 &
[2]+  Ejecutando              sleep 700 &

Ejecute ps, con la opción -j, para visualizar los números de identidad de proceso (PID) de estos trabajos:

ps -j

Lo anterior debe devolver una salida similar a la siguiente:

  PID  PGID   SID TTY          TIME CMD
 3624  3624  3624 pts/2    00:00:00 bash
 3924  3924  3624 pts/2    00:00:00 sleep
 3925  3925  3624 pts/2    00:00:00 sleep
 3937  3937  3624 pts/2    00:00:00 ps

Ejecute killall con la cadena «sleep» como argumento, a fin de terminar de manera normal de todos los procesos denominados sleep.

killall sleep

Lo anterior deberá devolver la siguiente salida:

[1]-  Terminado               sleep 600
[2]+  Terminado               sleep 700

Ejecute lo siguiente para generar dos nuevos trabajos en segundo plano:

sleep 800 & sleep 900 &

Lo anterior devolverá algo similar a lo siguiente:

[1] 3949
[2] 3950

Ejecute jobs para visualizar ambos trabajos:

jobs

Lo anterior deberá devolver la siguiente salida:

[1]-  Ejecutando              sleep 800 &
[2]+  Ejecutando              sleep 900 &

Ejecute ps, con la opción -j, para visualizar lo números de identidad de proceso (PID) de estos trabajos:

ps -j

Lo anterior debe devolver una salida similar a la siguiente:

  PID  PGID   SID TTY          TIME CMD
 3624  3624  3624 pts/2    00:00:00 bash
 3949  3949  3624 pts/2    00:00:00 sleep
 3950  3950  3624 pts/2    00:00:00 sleep
 3956  3956  3624 pts/2    00:00:00 ps

Ejecute killall, con la opción -s y el valor 9, junto con la cadena «sleep» como argumento, a fin de aniquilar (terminación anormal) de todos los procesos denominados sleep.

killall -s 9 sleep

Lo anterior deberá devolver la siguiente salida:

[1]-  Terminado (killed)      sleep 800
[2]+  Terminado (killed)      sleep 900

Uso de nice y renice.

Ejecute tar con las opciones jcf para generar el archivo pixmaps.tar.bz2 con el contenido del directorio /lib/modules, ejecutando lo siguiente:

tar jcf modulos.tar.bz2 /lib/modules

Al terminar utilice time para cuantificar la ejecución de tar con las opciones jxf para descomprimir el archivo modulos.tar.bz2. El objetivo será cuantificar la descompresión con la prioridad de planificación 0 (valor predeterminado del sistema), la cual permite utilizar los recursos que regularmente permite utilizar el sistema al usuario.

time tar jxf modulos.tar.bz2

La salida debe devolver algo similar a lo siguiente:

real	0m13.237s
user	0m12.491s
sys	0m1.824s

Ejecute nuevamente time con nice para ejecutar tar con las opciones jxf para descomprimir el archivo modulos.tar.bz2. El objetivo será realizar la descompresión cambiando la prioridad de planificación a 10 —valor predeterminado de nice — a fin de utilizar menos recursos de sistema.

time nice -n +10 tar jxf modulos.tar.bz2

La salida debe devolver algo similar a lo siguiente.

real	0m13.638s
user	0m12.947s
sys	0m1.908s

Los resultados deberán ser ligeramente mayores que la ejecución con el valor predeterminado de prioridad de planificación (0).

Ejecute nice con la opción -n y el valor 19, para ejecutar tar con las opciones jxf, con la menor prioridad posible, para descomprimir el archivo modulos.tar.bz2. El objetivo será realizar la descompresión cambiando la prioridad de planificación a 10 (valor predeterminado de nice), a fin de utilizar menos recursos de sistema.

time nice -n +20 tar jxf modulos.tar.bz2

La salida debe devolver algo similar a lo siguiente.

real	0m13.918s
user	0m13.045s
sys	0m1.875s

Los resultados deberán ser sensiblemente mayores que la ejecución con el valor predeterminado de prioridad de planificación (0).

El usuario regular solo pude definir valores de prioridad de planificación del 0 al 19, prioridad de planificación predeterminada a prioridad de planificación menos favorable. Los valores negativos, del -1 al -20, que son los más favorables, sólo los pude utilizar root.

Ejecutando su con la opción -c, con la cual se indicará entre comillas cualquier cosa para ser ejecutada como root, repita lo anterior pero con valor -20 para nice.

su -c "time nice -n -20  tar jxf modulos.tar.bz2"

Lo anterior solicitará se ingrese la clave de acceso de root y devolverá una salida similar a la siguiente:

real	0m13.328s
user	0m12.834s
sys	0m1.978s

Los resultados deberán ser sensiblemente inferiores que la ejecución con el valor predeterminado de prioridad de planificación (0).

Lo anterior generará un directorio denominado lib dentro del directorio de inicio del usuario, pero éste es propiedad de root, por lo cual el usuario regular será incapaz de eliminar. Elimine éste antes de continuar o bien se va a repetir procedimientos.

su -c "rm -fr /home/fulano/lib"

Renice sirve para cambiar la prioridad de planificación de procesos en ejecución por número de proceso, usuario o grupo. Los valores de prioridad de planificación se pueden visualizar utilizando ps con las opciones alx (todos los procesos en todas las terminales, en formato largo e incluyendo todos los procesos con o sin un TTY, respectivamente). Ejecute lo siguiente:

ps alx |less

Lo anterior mostrará las columnas F, UID, PID, PPID, PRI, NI, VSZ, RSS, WCHAN, STAT, TTY, TIME y COMMAND. Los valores de prioridad planificada corresponden a la sexta columna (NI). Para salir pulse la tecla q

El siguiente ejemplo cambia la prioridad de planificación a -10 al proceso que en el ejemplo corresponde al PID 45678:

su -c "renice -n -10 -p 45678"

El siguiente ejemplo cambia la prioridad de planificación a -10 a todos los procesos del usuario fulano:

su -c "renice -n -10 -u fulano"

El siguiente ejemplo cambia la prioridad de planificación a -10 a todos los procesos del grupo desarrollo:

su -c "renice -n -10 -g desarrollo"

El siguiente ejemplo cambia la prioridad de planificación a -10 al procesos 34567 del usuario fulano:

su -c "renice -n -10 -p 34567 -u fulano"

Uso de taskset.

Cambie al usuario root. A partir de este paso sólo podrá realizar los procedimientos con privilegios de root.

Taskset sólo tiene sentido utilizarlo cuando se dispone de más de un CPU lógico en el sistema. Ejecute nproc para determinar el número de CPUs lógicos en el sistema:

nproc

Lo anterior sólo devolverá el número de CPUs lógicos del sistema.

Ejecute lscpu para obtener información más detallada:

lscpu

Asumiendo que el sistema dispone de dos núcleos lógicos, lo anterior puede devolver una salida similar a la siguiente:

Architecture:          i686
CPU op-mode(s):        32-bit
Byte Order:            Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
Thread(s) per core:    1
Core(s) per socket:    2
Socket(s):             1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 14
Stepping:              12
CPU MHz:               1200.000
BogoMIPS:              3200.10
L1d cache:             32K
L1i cache:             32K
L2 cache:              1024K

Lo anterior representa un resumen del contenido del archivo /proc/cpuinfo, que también puede consultarse ejecutando lo siguiente:

less /proc/cpuinfo

Puede utilizar taskset para establecer u obtener la afinidad de CPU de un proceso a través de su PID o bien para ejecutar un nuevo procesos con una afinidad de CPU arbitraria. La afinidad de CPU es una propiedad de planificador del núcleo de Linux que vincula un procesos a un conjunto de CPUs en el sistema. Este planificador se encargará de que se mantenga la afinidad de CPU y que el proceso sólo se ejecute en el CPU o en los CPUs especificados. Cabe señalar que de manera nativa el planificador del núcleo de Linux incluye soporte para afinidad natural, la cual consiste en que el planificador intentará mantener los procesos en el mismo CPU tanto como sea práctico para mantener un buen desempeño en el sistema, por lo cual la manipulación de la afinidad de CPU sólo es útil para ciertas tareas y aplicaciones.

Cabe señalar que taskset siempre devolverá un error si se especifica una máscara de bit incorrecta o bien un CPU inexistente.

La afinidad de CPU se representa a través de una máscara de bit (bitmask), donde el bit de menor valor corresponde al primer CPU lógico y el bit mayor corresponde al último CPU lógico. Las máscaras de bit se representan en hexadecimal:

0x00000001
Corresponde al CPU #0
0x00000002
Corresponde al CPU #1
0x00000003
Corresponde los CPUs #0 y #1
0xFFFFFFFF
Corresponde a todos los CPUs (#0 hasta #31)

Para iniciar un nuevo proceso con una afinidad de CPU en particular, se utiliza la siguiente sintaxis:

taskset mascara mandato

Ejemplo:

taskset 0x00000001 tar jcf modulos.tar.bz2 /lib

Ejecute taskset con la opción -p para indicar que se utilizará un PID existente y el número de PID como argumento ara obtener la afinidad de CPU de un procesos en ejecución:

taskset -p pid

Ejemplo:

taskset -p 34567

Ejecute taskset con la opción -p para indicar que se utilizará un PID existente, la mascara de afinidad de CPU deseada y el número de PID como argumentos ara cambiar la afinidad de CPU de un procesos en ejecución:

taskset -p mascara pid

Ejemplo:

taskset -p 0x00000001 34567

Si se dificulta el uso de máscaras de bit en hexadecimal, también es posible utilizar la opción -c y una lista numérica de CPUs lógicos, donde 0 corresponde al primer CPU, 1 corresponde al segundo CPU lógico, 2 corresponde al tercer CPU lógico y así sucesivamente.

taskset -c -p lista pid

Ejemplo:

taskset -c -p 1 34567

También es posible especificar varios CPU de manera simultánea, definiendo una lista de éstos separada por comas y que también permite definir rangos. Ejemplos:

taskset -c 0,1 tar jcf modulos.tar.bz2 /lib
taskset -c -p 0,2 34567
taskset -c -p 4-7 34567

Al terminar los procedimientos, cierre la sesión de root.

Uso de top.

Top es una herramienta que proporciona una visualización continua y en tiempo real de los procesos activos en un sistema, como una lista que de modo predeterminado lo hace de acuerdo al uso del CPU. Puede ordenar la lista por uso de memoria y tiempo de ejecución.

Captura de pantalla de top

Para ordenar la lista de procesos por orden de uso de memoria, pulse SHIFT+M. Para ordena la lista de procesos por orden de tiempo de ejecución, pulse SHIFT+T. Para invertir el orden de la lista, pulse SHIFT+R. Para activar o bien desactivar, la visualización por hilos, pulse SHIFT+H. Para ordenar de nuevo la lista de procesos por orden de uso de CPU, pulse SHIFT+P.

Para mostrar los procesos de un usuario en específico, pulse la tecla u y defina a continuación el nombre del usuario.

Para terminar o aniquilar cualquier proceso, pulse la tecla k y defina a continuación el número de identidad de proceso que corresponda y luego la señal a utilizar (9 o 15).

Para cambiar la prioridad de planificación de cualquier proceso, pulse la tecla r y a continuación defina el número de identidad de proceso que corresponda y luego el valor de prioridad de planificación deseado.

Pulse la tecla h para ver el la ayuda completa de top.