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.