Saltar la navegación

5.- Gestión de procesos.

Proceso de arranque

Cuando se inicia el equipo primero inicia la BIOS que permite detectar y acceder al hardware del sistema. A partir de ahí, carga el gestor de arranque (que en Linux se llama GRUB) y en el caso de iniciar un sistema GNU/Linux accede al directorio /boot donde carga el kernel o núcleo del sistema operativo y ejecuta el proceso init con PID 1 que será el encargado de iniciar todos los servicios para que el sistema funcione correctamente. Tradicionalmente, el arranque y gestión de procesos de Linux estaba basado en Unix System V, pero en los últimos años, la mayoría de los Linux han adoptado systemd.
El servicio systemd inicia el proceso kthreadd con PID 2, que gestiona el resto de los servicios relacionados con el inicio. Todos los procesos posteriores son hijos, nietos,… del init o del kthreadd.

Comandos de procesos

Comando ps [-efl]

El comando ps lista los procesos vivos (activo, en espera o bloqueados. Los procesos ya terminados no aparecen.
Las opciones habituales son ejecutar ps -ef ó ps -efl
miguel@SistemasUbuntu:~$ ps -ef
UID
PID PPID C STIME TTY TIME CMD
root 1 0 1 23:41 ?
00:00:02 /sbin/init splash
root 2
0 0 23:41 ? 00:00:00 [kthreadd]
root 3 2 0 23:41 ? 00:00:00 [
kworker/0:0]
……………………………

miguel
1387 1 0 23:42 ? 00:00:00 /lib/systemd/systemd --user
………………………..

miguel
2054 1387 1 23:43 ? 00:00:00 /usr/bin/gnome-calendar --gapplication-service
miguel
2055 1387 1 23:43 ? 00:00:00 /usr/lib/gnome-terminal/gnome-terminal-server
miguel
2142 2055 0 23:43 pts/0 00:00:00 bash
miguel
2153 1418 0 23:43 tty2 00:00:00 update-notifier
miguel
2162 2153 13 23:43 tty2 00:00:01 /usr/bin/python3 /usr/lib/update-notifier/apt-check
miguel
2177 2142 0 23:43 pts/0 00:00:00 ps -ef      #El último proceso es el PID 2177, es la propia ejecución del comando ps –ef. Su padre (PPID) es el PID 2142, que es la propia terminal bash y su padre es el 2055. El padre del 2055 es el 1387, que a la vez es hijo del PID 1 que es el proceso init.

Significado de cada columna del comando ps -ef
UID: Usuario que ha ejecutado el proceso
PID: Identificador de proceso. Son correlativos, se han ejecutado tantos procesos como el último PID. Todos los que faltan, son procesos terminados.
PPID: Identificador de proceso del padre, es decir, PID del padre
C: Porcentaje de utilización de la CPU para ese proceso
STIME: Hora que se ha iniciado a ejecutar el proceso
TTY: Terminal o consola donde se ha ejecutado el proceso
TIME: Tiempo utilizado del procesador para la ejecución de este proceso
CMD: Comando o nombre del proceso que se ha ejecutado

Terminar procesos. Comando kill

Para terminar o matar un proceso, liberando la memoria, se utiliza el comando siguiente:
$ kill -9 PID
Un proceso lo puede terminar el usuario que ejecuta el proceso y el administrador.

Con el -9, estamos ejecutando kill con la señal 9. Sino ponemos -9, kill se ejecuta con la señal por defecto que es la 15. Es decir, es lo mismo ejecutar $kill PID que $kill -15 PID
La señal -9 es más potente que la -15. Es decir, cuando un proceso se ha bloqueado, suele ser más garantía eliminar el proceso con kill -9

Para ver todas las señales admitidas por el comando kill, ver la ayuda con $ man kill

Comando yes

El comando yes manda el carácter y infinitamente, hasta que lo finalicemos. Si se ejecuta $ yes hola devuelve hola infinitamente.

Este comando se va a utilizar para realizar de forma didáctica algunos ejemplos de procesos. Es interesante, ver como se puede llenar una partición en minutos, con un comando aparentemente inofensivo como  $ yes > archivo.txt

Comando top

El comando top, muestra los procesos ordenados por consumo de recursos.

Ejemplo. Ejecutar yes en una terminal y desde otra terminal descubrir PID, consumo de recursos y matar yes

Paso 1.
En primera terminal, ejecutar yes:
miguel@SistemasUbuntu:~$ yes
y
y          
#Muestra y infinitas, hasta que paremos el proceso. Consume mucho procesador

Paso 2.
Sin cerrar la primera terminal, abrir una segunda terminal, ejecutar ps –ef o top (en ambos comandos, se puede ver PID y consumo de procesador)
miguel@SistemasUbuntu:~$ top
top
- 00:46:15 up 13 min, 2 users, load average: 3,84, 2,90, 1,52
Tareas: 209 total, 5 ejecutar, 174 hibernar, 0 detener, 0
zombie
%
Cpu(s): 29,1 usuario, 16,2 sist, 0,2 adecuado, 53,9 inact, 0,3 en espera, 0,0 hardw int, 0,2 sof
KiB
Mem : 2041304 total, 241500 libre, 1124408 usado, 675396 búfer/caché
KiB Intercambio: 3999740 total, 3999740 libre, 0 usado. 744020
dispon Mem
PID USUARIO PR NI VIRT RES SHR S %CPU %MEM HORA+ ORDEN

1076 miguel 20 0 447168 100404 47388 R 20,0 4,9 0:31.35
Xorg
1634 miguel 20 0 802324 39420 28316 R 20,0 1,9 2:14.02
gnome-terminal-
31
root 20 0 0 0 0 R 15,0 0,0 0:29.58 kworker/u2:1
1964 miguel 20 0 14576 732 668 S 15,0 0,0 1:14.99 yes

2214 miguel 20 0 49020 3860 3236 R 15,0 0,2 0:00.03 top
      #En este ejemplo, el comando yes tiene el PID 2214 y está consumiendo el 15% de CPU (la velocidad a las que manda y es muy grande)

Paso 3. Terminar el proceso yes definitivamente:
miguel@SistemasUbuntu:~ $ kill -9 2214

Este ejemplo, ha mostrado los pasos a seguir para finalizar un programa que se bloquee. En una terminal, se averigua el PID del proceso bloqueado, y se ejecuta kill.

Prioridad de procesos: nice y renice

En Linux, la prioridad de un proceso entá entre -20 que es la prioridad máxima y 19 que es la prioridad mínima.

Las prioridades asignadas a cada proceso se visualizan en la columna “NI” cuando ejecutamos ps –efl (hemos incorporado la opción –l)

Comando nice. Ejecutar un proceso con una prioridad concreta

Por defecto todos los procesos se ejecutan con la prioridad 0. Para ejecutar un proceso con otra prioridad, se utiliza nice. Sintaxis del comando nice:
nice [-n prioridad] comando

Ejemplos:
#
nice yes Ejecuta yes con prioridad 10 (nice sin opciones)
#
nice -n -10 yes Asigna la prioridad -10 al proceso yes

Observación
Todos los usuarios pueden utilizar la instrucción nice, pero solo root puede utilizar los negativos. Para el resto de los usuarios la máxima prioridad es 0.

Comando renice. Cambiar prioridad a un proceso que ya está en ejecución.

El comando renice sirve para cambiar la prioridad a un proceso que ya se está ejecutando. Su sintaxis es:
renice [prioridad] – p PID

Ejemplo:
$
renice 10 -p 3183   Cambia a prioridad 10 el proceso con PID 3183. Si no se especifica ninguna prioridad, se cambia la prioridad a 0.

Observaciones:

  • Los usuarios solo pueden utilizar renice para bajar la prioridad.
  • El superoot puede subir y bajar la prioridad.

Autoevaluación

Pregunta

Se tiene la siguiente captura de un comando.


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


0   S miguel  4269  4255  13  10   8     -    2850  wait_w   10:54    pts/0  00:00:04    yes


Indica las correctas.

Respuestas

Para obtener dicha captura se ha ejecutado ps -efl

El comando yes tiene prioridad 10

El comando yes está consumiendo un 13% de procesador

El comando yes se está ejecutando con una prioridad por debajo de lo normal

Retroalimentación