2.4 Identificar los procesos que hacen un uso intensivo de la CPU y de la memoria, ajustar la prioridad de los procesos con renice y eliminar procesos

Un tema de suma importancia para la administración del sistema operativo Linux, es importante saber cómo realizar tareas específicas con los procesos que se están ejecutando, ya sea en primer o segundo plano, si bien resulta imposible plasmar en un documento todo lo que pudiese ver con el tema de la administración de procesos, trataré de abarcar los temas más relevantes, mis recomendaciones para poder tener los conocimientos más sólidos es llevar a la práctica exhaustiva   de todo lo aquí plasmado.

Empezamos con algunas definiciones importantes

Procesos

Conjunto de código compilado y que se está ejecutando en memoria, el sistema operativo otorga identificadores numéricos a los procesos llamados ProcessID (PID) cada proceso tiene un padre llamado Parent Process ID (PPID), recordemos que el proceso con PID=1 es init o bien systemd en las versiones más actuales de Linux

 

4218

 

4214

Daemon

Procesos que se requiere que nunca caduquen como los servicios de red que se instalan en servidores DHCP, FTP, CORREO, etc.

Trabajando con Procesos

&

El carácter & colocado al final de un comando permite mandar ese procesos a segundo plano y nos devuelve el jobID, el PID y el PROMT para seguir trabajando.

 

[1] 4238

bg

Cuando un usuario ejecuta un comando o proceso en una terminal este puede ejecutarse en primer o segundo plano, y decimos que se ejecuta en primer plano cuando el proceso o comando toma el control de la terminal en la que estamos trabajando, como ejemplo tenemos el comando top, en segundo plano tenemos por ejemplo: crond, syslog y sendmail.

El comando bg puede retomar los procesos que fueron detenidos y seguir la ejecución en segundo plano, ejemplo:

Lanzamos el comando sleep 200 y detenemos el proceso con ctrl+z

 

(ctrl+Z) ^Z

[1]+ Detenido sleep 200

Lo anterior indica que el procesos fue detenido y en espera con un valor de job = 1, después continuamos su ejecución con bg y el número de job, pero cabe mencionar que la ejecución se lleva en segundo plano

 

[1]- sleep 200 &

fg

El comando fg trae los procesos que están en ejecución en segundo plano a primer plano., continuando con los ejemplos de bg tenemos el process [1] en background

 

sleep 200

Para parar un proceso en ejecución en primero plano utilizamos la combinación de teclas ctrl + c

 

sleep 200

(ctrl+c) ^C

Comando jobs

Muestra una lista de los comandos que se encuentran en segundo plano ya ejecutándose o que fueron suspendidos. Es importante que considere la diferencia entre el jobID y el PID ya que el comando jobs muestra el jobID que está relacionado de la sesión actual de la shell mientras que el PID es el mismo en todo el sistema.

 

[1]+ Detenido sleep 200

[2]- Ejecutando sleep 2000 &

Mostrar información como jobID el PID el status del proceso y el comando que se invocó.

 

[2]+  4319 Parado                  sleep 200

[3]-  4323 Ejecutando              sleep 1000 &

Muestra tareas en ejecución

 

[3]-  Ejecutando              sleep 1000 &

pidof

El comando pidof nos permite saber los PID´s por nombre de aplicación.

 

4323 4319

 

4218 2954

 

4347 4218 2954

Comando kill

En ocasiones se requiere terminar un proceso que entró en conflicto con otros o por cuestiones de recursos de otros procesos, por cualquiera que sea la situación, el comando kill nos permite matar (terminar) los procesos enviando una señal de al proceso causando su terminación, su sintaxis

Para conocer las señales que se le pueden enviar a un PID con kill para que se ejecute:

 

1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP

6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1

11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM

16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP

21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ

26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR

31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3

38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8

43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13

48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12

53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7

58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2

63) SIGRTMAX-1 64) SIGRTMAX

Las señales más utilizadas

1) SIGHUP terminará el proceso

9) SIGKILL forzará la terminación de los procesos sin ejecutar rutinas de finalización. La señal por default no especifica al comando kill.

15) SIGTERM termina el proceso pero ejecuta la rutina de finalización como el cierre de documentos.

Ejemplos :

 

[1]+  4373 Parado                  sleep 30000

[2]-  4374 Ejecutando           sleep 10000 &

 

[2]-  Terminado (killed)      sleep 10000

 

[1]+  4373 Parado                  sleep 30000

Para terminar procesos por número de job, en este caso el job=1, ejecutamos

 

[1]+  4373 Terminado               sleep 30000

killall o pkill

Finalizar procesos por su nombre, su sintaxis

 

[2] 4375

 

[1]+  4375 Ejecutando              sleep 23000 &

 

[1]+  Terminado               sleep 23000

nohup

Permite que los procesos se continúen ejecutándose aún si el propietario de la sesión donde el proceso fue lanzado cerrará su sesión en el sistema, ya que por lo general cuando se cierra sesión todos los procesos iniciados por el usuario recibe la señal singup y son terminados, así que nohup da el privilegio de ser inmune a esta señal al momento de logout del usuario y el proceso seguirá ejecutándose.

El siguiente ejemplo es un poco complejo trataré de explicar cada acción, sin embargo no dude que con la práctica en su propio sistema podrá entender el tema

Creamos un script que imprime la fecha cada 5 segundos

Damos los permisos de ejecución adecuados

Verificamos las opciones de la Shell para tener activado huponexit

 

huponexit off

Activamos huponexit

 

huponexit on

Ejecutamos el archivo sh

 

nohup: se descarta la entrada y se añade la salida a «nohup.out»

Cerramos sesión del usuario normal

 

logout

Verificamos el archivo creado por nohup en el home del usuario nohup.out

 

mié dic  5 15:17:47 PST 2018

mié dic  5 15:17:52 PST 2018

mié dic  5 15:17:57 PST 2018

mié dic  5 15:18:02 PST 2018

mié dic  5 15:18:07 PST 2018

mié dic  5 15:18:12 PST 2018

Buscamos los procesos en memoria

 

frank     1692 0.0 0.0 107948   348 pts/0 S 15:18  0:00 sleep 5

root      1694 0.0 0.0 112724   940 pts/0 S+ 15:18  0:00 grep –color=auto sleep

Terminamos el proceso sleep

 

root      1786 0.0 0.0 112724   940 pts/0 S+ 15:22  0:00 grep –color=auto sleep

ps

ps (process status o estatus de proceso) nos permite visualizar todos los procesos lanzados por mi usuario u otros usuarios que se estén ejecutando en el sistema, permite ver su PID tiempo de ejecución entre otros datos.

Lazado como tal el comando lanza la lista de los procesos que al usuario actual pertenecen y los asociados a la terminal.

Opciones:

-a Muestra los procesos que le pertenecen a otros usuarios y que están asociados a una terminal.

-l Formato detallado que incluye la prioridad, el PPID entre otra información.

-u Formato de usuario incluye hora de inicio de los procesos y nombres de usuarios,

-x Incluye a los procesos que no están asociados a ninguna terminal. La opción –x se utiliza para ver un proceso demonio y otros que no son incluidos en terminal

-C Muestra instancias del comando.

-U Muestra todos los procesos que pertenecen a un usuario.

Ejemplos:

 

PID TTY          TIME CMD

1486 pts/0     00:00:00 bash

1816 pts/0     00:00:00 ps

Una de las opciones más utilizadas de ps es ps aux o bien ps aux que muestra los procesos que pertenecen a otros usuarios y los procesos que no están asociados a ninguna terminal y todos los proceso en modo usuario.

 

USER       PID %CPU %MEM    VSZ RSS TTY  STAT START TIME COMMAND

root         1 0.1 0.3 193520  6524 ? Ss 15:05   0:01 /usr/lib/systemd/systemd –switched-root –system –deserialize 22

root         2 0.0 0.0    0 0 ? S    15:05 0:00 [kthreadd]

root         3 0.0 0.0    0 0 ? S    15:05 0:00 [ksoftirqd/0]

root         5 0.0 0.0    0 0 ? S<   15:05 0:00 [kworker/0:0H]

root         6 0.0 0.0    0 0 ? S    15:05 0:00 [kworker/u8:0]

root         7 0.0 0.0    0 0 ? S    15:05 0:00 [migration/0]

root         8 0.0 0.0    0 0 ? S    15:05 0:00 [rcu_bh]

 

USER       PID %CPU %MEM    VSZ RSS TTY  STAT START TIME COMMAND

root      1015 0.0 0.2 112792  4204 ? Ss 15:05   0:00 /usr/sbin/sshd -D

root      1482 0.0 0.3 160880  5668 ? Ss 15:06   0:00 sshd: root@pts/0

 

root      1015 0.0 0.2 112792  4204 ? Ss 15:05   0:00 /usr/sbin/sshd -D

root      1482 0.0 0.3 160880  5668 ? Ss 15:06   0:00 sshd: root@pts/0

root      1822 0.0 0.0 112724   940 pts/0 S+ 15:28  0:00 grep –color=auto sshd

 

 PID TTY          TIME CMD

   1 ?       00:00:01 systemd

   2 ?       00:00:00 kthreadd

   3 ?       00:00:00 ksoftirqd/0

   5 ?       00:00:00 kworker/0:0H

. . .

pgrep

Permite la búsqueda de procesos por nombre devolviendo el PID

 

1833

1834

1835

pstree

Muestra una lista en orden jerárquico de los procesos en formato de árbol y nos ayuda bastante en la relación padre e hijo de los procesos. Si el comando no se encuentra instalado bastará con ejecutar

Opciones:

-a muestra los argumentos de línea de comandos

-c deshabilita la compactación de árboles idénticos

-p muestra los ID´s de los procesos

-u muestra las transiciones entre los ID’s de usuarios

-V muestra la versión del programa.

Ejemplos

Pruebe ejecutando los siguientes comandos

uptime

Permite saber hace cuánto tiempo el sistema se ha iniciado este regresa una única línea mostrando la siguiente información en columna:

 

Hora actual

Desde hace cuánto el sistema está encendido

Total de usuarios autenticados en el sistema

Utilización promedio del sistema durante el último minuto, los últimos 5 minutos y los últimos 15 minutos.

 

15:35:14 up 29 min,  1 user, load average: 0.00, 0.01, 0.01

 

uptime from procps-ng 3.3.10

 

2018-12-05 15:05:37

free

Muestra el monto total de memoria, memoria libre y memoria utilizada por el sistema, también muestra información acerca de la memoria swap

 

                        total used free           shared buff/cache available

Mem:        1882336 107088     1523812 8692 251436     1597980

Swap:       1572860      0 1572860

 

                   total        used free       shared buff/cache available

Mem:           1.8G 104M        1.5G 8.5M 245M        1.5G

Swap:          1.5G 0B         1.5G

Total:         3.3G 104M        3.0G

top

Podemos decir que top es la unión de ps+uptime+free con la diferencia que muestra los procesos en tiempo real con actualización constante, por defecto top muestra los procesos en orden descendente de acuerdo al consumo de procesados.

Si no se especifica opción alguna top es actualizada cada 3 segundos, si desea algún tiempo específico de refresh ejecute

Opciones:

-b ejecuta top en modo batch

-d especifica tiempo de refresh

-i ignora los procesos en espera

-n muestra la cantidad de refresh antes de salir

-s ejecuta top en modo seguro

 

Opciones de navegación

spacebar

refresh

k

finaliza un proceso. Luego de presionar la tecla k, top le pregunta el ID del proceso que se desea finalizar

q

finaliza el programa top

 

top – 15:41:17 up 35 min,  1 user, load average: 0.00, 0.01, 0.01

Tasks: 121 total,   1 running, 120 sleeping,   0 stopped, 0 zombie

%Cpu(s):  0.1 us, 0.0 sy,  0.0 ni, 99.9 id, 0.0 wa,  0.0 hi, 0.0 si, 0.0 st

KiB Mem :  1882336 total,  1523300 free, 107524 used,   251512 buff/cache

KiB Swap:  1572860 total,  1572860 free,     0 used. 1597648 avail Mem

PID USER      PR NI VIRT   RES SHR S %CPU %MEM     TIME+ COMMAND                                                        

1 root      20 0 193520   6524 4048 S 0.0  0.3 0:01.27 systemd                                                                       

2 root      20 0 0      0 0 S 0.0 0.0   0:00.00 kthreadd

En la salida del comando top con su respectivo refresh podemos observar datos muy interesantes  como el total de memoria, la memoria libre la ocupada el % de cpu usado , total de tareas en ejecución , uso de swap etc, esta herramienta es una de las más utilizadas en la administración del sistema operativo Linux

nice

Como ya debes saber Linux es un sistema operativo multiprocesos esto lo hace compartiendo entre los procesos la memoria RAM, el CPU y otro recursos, en ocasiones necesitamos ejecutar proceso en simultáneo o con otra prioridad de los recursos, el comando nice permite iniciar procesos con una prioridad para que estos reciban mayor recursos del CPU, el rango de prioridad es de -20 que es más alta, hasta la más baja que es la 19.

El comando nice solo puede ser ejecutado por root.

Ejemplos:

Dar prioridad de 15 al comando sleep 300

 

[1] 1899

 

F S   UID PID  PPID C PRI  NI ADDR SZ WCHAN  TTY TIME CMD

4 S     0 1486 1482  0 80 0 – 29642 do_wai pts/0    00:00:00 bash

0 S     0 1899 1486  0 95 15 – 26987 hrtime pts/0    00:00:00 sleep

0 R     0 1901 1486  0 80 0 – 38300 –      pts/0 00:00:00 ps

Dar prioridad de -15 al comando sleep 300

o bien

 

[2] 1903

 

[2] 1903

F S   UID PID  PPID C PRI  NI ADDR SZ WCHAN  TTY TIME CMD

4 S     0 1486 1482  0 80 0 – 29642 do_wai pts/0    00:00:00 bash

0 S     0 1899 1486  0 95 15 – 26987 hrtime pts/0    00:00:00 sleep

4 S     0 1903 1486  0 65 -15 – 26987 hrtime pts/0    00:00:00 sleep

0 R     0 1904 1486  0 80 0 – 38300 –      pts/0 00:00:00 ps

En la columna NI podemos ver la prioridad de los procesos.

renice

Una vez teniendo la prioridad por nice al iniciar el proceso con renice podemos cambiar la prioridad de procesos ya iniciados, sus sintaxis

-u interpreta los objetivos como nombre de usuarios

-p interpreta los objetivos como ID´s de proceso

 

1903 (process ID) old priority -15, new priority 10

 

F S   UID PID  PPID C PRI  NI ADDR SZ WCHAN  TTY TIME CMD

4 S     0 1486 1482  0 80 0 – 29642 do_wai pts/0    00:00:00 bash

0 S     0 1899 1486  0 95 15 – 26987 hrtime pts/0    00:00:00 sleep

4 S     0 1903 1486  0 90 10 – 26987 hrtime pts/0    00:00:00 sleep

0 R     0 1906 1486  0 80 0 – 38300 –      pts/0 00:00:00 ps

@franklinux

 

Deja un comentario