103.5 - Crear, supervisar y matar procesos
Importancia
4
Descripción
El candidato debe ser capaz de realizar una gestión básica de los procesos.
Áreas de conocimiento clave:
Ejecutar trabajos en primer y segundo plano.
Enviar señales a los programas para que continúen ejecutándose después del cierre de sesión.
Supervisar procesos activos.
Seleccionar y ordenar procesos para su visualización.
Enviar señales a los procesos.
Contenidos
Control de trabajos
Los trabajos (Jobs) son procesos que se han iniciado de forma interactiva a través de un terminal, enviados a un segundo plano y aún no han finalizado la ejecución. Puedes conocer los trabajos activos (y su estado) en Linux ejecutando jobs
.
El comando jobs anterior no produjo ningún resultado, lo que significa que no hay trabajos activos en este momento. Creemos nuestro primer trabajo ejecutando un comando que tarde un poco en finalizar la ejecución (el comando sleep con un parámetro de 60) y, mientras se ejecuta, presione Ctrl + Z:
La ejecución del comando se ha detenido (o, mejor dicho, suspendido) y el símbolo del sistema vuelve a estar disponible, si pruebas a ejecutar jobs otra vez, buscará trabajos por segunda vez y encontrará el suspendido.
En el resultado verás [1]
, es el ID del trabajo y se puede utilizar, precedido por %
para cambiar el estado del trabajo mediante las utilidades bg
y kill
más adelante).
Y el signo +
indica el trabajo actual predeterminado (es decir, el último suspendido o enviado al segundo plano). El trabajo anterior está marcado con un signo menos (-). Cualquier otro trabajo anterior no está marcado.
Otros parámetros del comando son:
Recuerda que un trabajo tiene un ID de trabajo y un ID de proceso (PID).
Especificaciones de trabajos
El comando jobs, así como otras utilidades como fg
, bg
y kill
(que verá en la siguiente sección) necesitan una especificación de trabajo (o jobspec) para actuar sobre un trabajo en particular. Como acabamos de ver, esto puede ser, y normalmente es, el ID del trabajo precedido por %. Sin embargo, otras especificaciones de trabajo también son posibles. Echemos un vistazo a ellos:
%n
-> Trabajo cuyo número de identificación es n .%str
-> Trabajo cuya línea de comando comienza con str .%?str
-> Trabajo cuya línea de comando contiene str .%+ o %%
-> Trabajo actual (el último que se inició en segundo plano o suspendido del primer plano).%-
-> Trabajo anterior (el que era% +
antes del predeterminado, el actual).
Por ejemplo:
Estado del trabajo: suspensión, primer plano y segundo plano
Una vez que un trabajo está en segundo plano o ha sido suspendido, podemos hacer cualquiera de estas tres cosas:
Llevarlo al primer plano con fg (foreground):
fg
mueve el trabajo especificado al primer plano y lo convierte en el trabajo actual. Ahora podemos esperar hasta que termine, detenerlo nuevamente con Ctrl+Z o terminarlo con Ctrl+C.
Llevarlo a un segundo plano con bg (background):
Una vez en segundo plano, el trabajo se puede volver a poner en primer plano con fg o matar (ver más abajo). Ten en cuenta el signo (&
) que significa que el trabajo se ha enviado a segundo plano. De hecho, también puede usar el signo y comenzar un proceso directamente en segundo plano:
Termine con una señal SIGTERM con kill:
Para asegurarnos de que el trabajo ha finalizado, ejecuta nuevamente jobs
.
Trabajos separados: nohup
nohup
Los trabajos que hemos visto en las secciones anteriores se adjuntaron a la sesión del usuario que los invocó. Eso significa que si la sesión se termina, los trabajos desaparecen. Sin embargo, es posible separar los trabajos de las sesiones y hacer que se ejecuten incluso después de cerrar la sesión. Esto se logra con el comando nohup (“no hangup”).
Separemos el trabajo en segundo plano ping localhost de la sesión actual:
La salida nos muestra la ID del trabajo ([1]
) y el PID ( 1251
), seguido de un mensaje que nos informa sobre el archivo nohup.out. Este es el archivo predeterminado donde se guardarán stdout
y stderr
.
Ahora podemos presionar sesión, iniciar otro como Ctrl + C para liberar el símbolo del sistema, cerrar la root
y usar tail -f
para verificar si el comando se está ejecutando y la salida se está escribiendo en el archivo predeterminado:
Si queremos matar el proceso, debemos especificar su PID:
Si te has olvidado del PID del proceso, puedes buscar con ps aux | grep ping
Monitorización de procesos
Un proceso o tarea es una instancia de un programa en ejecución. Por lo tanto, se crean nuevos procesos cada vez que escribe comandos en el terminal. El comando watch
ejecuta un programa periódicamente (2 segundos por defecto) y nos permite mirar el cambio de salida del programa con el tiempo. Por ejemplo, podemos monitorear cómo cambia el promedio de carga a medida que se ejecutan más procesos escribiendo watch uptime
El comando se ejecuta hasta que se interrumpe, por lo que deberíamos detenerlo con Ctrl + C. Obtenemos dos líneas como salida: la primera corresponde a watch y nos dice con qué frecuencia se ejecutará el comando ( Every 2.0s: uptime), qué comando/programa mirar ( uptime) así como el comando nombre de host y fecha ( debian: mar 20 de agosto 23:31:27 2019). La segunda línea de salida es el tiempo de actividad e incluye la hora ( 23:31:27), cuánto tiempo ha estado activo el sistema ( up 21 min), el número de usuarios activos ( 1 usuario) y carga promedio del sistema o número de procesos en ejecución o en estado de espera durante los últimos 1, 5 y 15 minutos ( promedio de carga: 0.00, 0.00, 0.00).
Del mismo modo, puedes verificar el uso de la memoria a medida que se crean nuevos procesos con watch free
.
Para cambiar el intervalo de actualización para watch usa las opciones -n
o --interval
más el número de segundos con watch -n 5 free
Envío de señales a procesos: kill
kill
El comando kill, a pesar de su nombre, es un comando que envia señales a procesos. Cada proceso tiene un identificador de proceso único o PID. Una forma de averiguar el PID de un proceso es mediante el comando pgrep
o pidof
seguido del nombre del proceso:
Similar a pgrep, el comando pkill mata un proceso basado en su nombre:
Para matar varias instancias del mismo proceso, se puede usar el comando killall
Tanto pkill
como killall
funcionan de la misma manera que kill
en que envían una señal de terminación a los procesos especificados. Si no se proporciona ninguna señal, se envía el valor predeterminado de SIGTERM. Sin embargo, kill solo toma un trabajo o una ID de proceso como argumento. Las señales se pueden especificar por nombre, numero o con opciones.
Para que kill funcione de manera similar a pkill o killall (y nos ahorremos los comandos para descubrir los PID primero) podemos usar la sustitución de comandos:
Tambien podemos cerrar los procesos de un usuario (por ejemplo por una sesión abierta descontrolada a un intruso):
Algunas señales comunes a enviar (recuerda que con kill -l
puedes revisarlos todos):
kill -2
SIGINT
Interrumpir un proceso (Ctrl + C).
kill -9
SIGKILL
Mata el proceso de golpe, es más agresivo, puede dejar procesos "zombie". No hay ningun proceso inmutable para este comando. Último recurso.
kill -15
SIGTERM
termina lo que estas haciendo y finaliza, reubica todos los procesos que dependen de él a otros procesos.
kill -18
SIGCONT
continue, reanuda un proceso en pausa pero lo hace en el terminal desde que has lanzado el comando por lo que el ctrl+C ya no hace caso. Se ha pasado a segundo plano. Si queremos reanudar ponemos manualmente el kill -2
kill -19
SIGSTOP
stop, proceso en pausa (Ctrl+Z), por ejemplo con el buscaminas o el pìng. El proceso podemos seguir viéndolo.
Top y ps
Cuando se trata de monitoreo de procesos, dos herramientas invaluables son top y ps. Mientras que el primero produce resultados dinámicamente, el segundo lo hace estáticamente. En cualquier caso, ambos son excelentes utilidades para tener una visión integral de todos los procesos en el sistema.
top
te muestra los procesos en tiempo real, es como un administrador de tareas.
Con la letra "f" puedes modificar la vista de filtros y añadir o quitar columnas con "espacio".
Con derecha o izquierda puedes mover las columnas también.
Con "r" (renice) cambias la prioridad de un proceso, esto lo veremos más adelante.
Con "M" ordena por uso de memoria, con "N" por numero de ID, con "T" por tiempo de ejecución y con "P" por porcentaje de CPU.
Para salir con "q".
La salida top se divide en dos áreas: el área resumen y el área de tareas.
En el área de resumen se compone de las cinco filas superiores y nos proporciona la siguiente información:
Hora actual (formato 24 horas): 11:20:29
Tiempo de actividad (cantidad de tiempo que el equipo ha estado activo y funcionando): 2:21 up
Número de usuarios conectados y promedio de carga de la CPU durante los últimos 1, 5 y 15 minutos, respectivamente:
Número total de procesos en modo activo
Ejecutándose (los ejecutados en el momento)
Durmiendo (aquellos que esperan reanudar la ejecución)
Detenido (por una señal de control de trabajo)
Zombie (aquellos que han completado la ejecución pero todavía están esperando que su proceso padre los elimine de la tabla de procesos)
Procesos de usuario (us)
Procesos de sistema/kernel (sy)
Procesos establecidos en un valor nice — cuanto mejor sea el valor, menor será la prioridad (ni)
Nada — tiempo de inactividad de la CPU (id)
Procesos en espera de operaciones de E/S (wa)
Procesos que sirven interrupciones de hardware — periféricos que envían las señales del procesador que requieren atención (hi)
Procesos que sirven interrupciones de software (si)
Los procesos que sirven las tareas de otras máquinas virtuales en un entorno virtual, por lo tanto, roban tiempo (st)
Monto total de memoria
Memoria sin utilizar
Memoria en uso
La memoria intermedia (buffer) y almacenada en caché para evitar el acceso excesivo al disco
Observa cómo el total es la suma de los otros tres valores .
La cantidad total de espacio de swap
Espacio de swap no utilizado
Espacio en uso de swap
La cantidad de memoria de intercambio que se puede asignar a los procesos sin causar más intercambio
El área de tareas en top: campos y columnas
Debajo del área de resumen, aparece el área de tareas, que incluye una serie de campos y columnas de información sobre los procesos en ejecución:
PID
Identificador de proceso.USER
Usuario que emitió el comando que generó el proceso.PR
Prioridad de proceso en el kernel.NI
Valor nice del proceso. Los valores más bajos tienen mayor prioridad que los más altos.VIRT
Cantidad total de memoria utilizada por el proceso (incluido la swap).RES
Memoria RAM utilizada por el proceso.SHR
Memoria compartida del proceso con otros procesos.S
Estado del proceso. Los valores incluyen: S (suspensión interrumpible — esperando que termine un evento), R (ejecutable — ya sea en ejecución o en la cola que se ejecutará) o Z (procesos secundarios terminados en zombies cuyas estructuras de datos aún no se han eliminado de la tabla de procesos).%CPU
Porcentaje de CPU utilizado por el proceso.%MEM
Porcentaje de RAM utilizada por el proceso, es decir, el valor RES expresado como porcentaje.TIME+
Tiempo total de actividad del proceso.COMMAND
Nombre del comando/programa que generó el proceso..
A parte de top existen otras utilidades relacionadas que aumentan la experiencia de usuario de gestión de procesos, una es htop y la otra es bottom
htop
viene instalada por defecto en distribuciones Ubuntu sino puedes instalarla con un simple apt installPara instalarlo simplemente ejecuta:
Luego el comando es btm
Visualización de procesos estáticos
Como se dijo anteriormente, ps muestra una instantánea de los procesos. Para ver todos los procesos con un terminal (tty), escriba ps a
o ps -p 811
para buscar un proceso por su PID.
Al final, este comando es un snapshot de los procesos que hay en el sistema en el momento en que se ejecuta el comando pero no los ves en vivo sino la instantánea:
Del mismo modo, para buscar los procesos iniciados por un usuario en particular usaremos:
Podemos configurar los parámetros que nos interesa ver:
Todos estos comandos lo que están haciendo es consultar ficheros del sistema que están guardados en ficheros de registro en el directorio /proc
.
Organización de ventanas
tmux
es un llamado "terminal multiplexer", ósea una herramienta de panelización para poder manejar múltiples terminales en una sola ventana. En realidad esto es sencillo en un entorno gráfico o en terminal podriamos simplemente generar nuevas pero el poder de tmux
reside en que puedes asociar, salir o disociar los terminales mientras siguen funcionando de fondo y puedes volver a conectarte y quedarte en el momento en el que estabas.
tmux
fue lanzado en 2007 y es mas moderno que screen
(el cual veremos más abajo), este incluye algunas diferencias notables:
Modelo cliente-servidor: el servidor suministra una serie de sesiones, cada una de las cuales puede tener varias ventanas vinculadas que, a su vez, pueden ser compartidas por varios clientes.
Selección interactiva de sesiones, ventanas y clientes a través de menús.
La misma ventana se puede vincular a varias sesiones.
Disponibilidad de diseños de teclas vim y Emacs.
Soporte para terminales UTF-8 y 256 colores.
En general, tiene una interfaz más moderna y cómoda y es especialmente útil para trabajar en terminales remotos ya que te permite comenzar una tarea de larga duración, desconectar dejándolo funcionando y recuperar el progreso en la siguiente conexión.
Los archivos de configuración para tmux
se encuentran normalmente en /etc/tmux.conf
y ~/.tmux.conf
. También existe la posibilidad de iniciar tmux -f
para proporcionar un archivo de configuración alternativo. Puede encontrar un ejemplo de archivo de configuración tmux
ubicado en /usr/share/doc/tmux/example_tmux.conf
.
Para empezar escribiremos tmux
que creará una sesión:
En la barra inferior podemos ver:
[0]
-> El nombre de referencia de la ventana0:bash
-> el 0 indica el índice de la ventana,bash
el nombre del terminal y el * indica la ventana actual."lnxsvr" 17:07 05-Sep-23
-> Esto indica el hostname y la fecha y hora.
Podemos salir del terminal de tmux simplemente con exit
. Si solo hay una sesión, nos devolverá la terminal por defecto.
Para volver a crear una sesión con un nombre diferente:
O para asociarse a una sesión de tmux
ya funcionando:
Podemos listar el número de sesiones abiertas de tmux
con:
O destruir las sesiones abiertas con:
Su uso de basa en comandos con el prefijo Ctrl+b
:
Ctrl+b c
-> crear nueva ventana.
Ctrl+b n
-> cambiar a la siguiente terminal.
Ctrl+b p
-> cambiar a la anterior terminal.
Ctrl+b 0,1,2,3
-> para moverme entre terminales.
Ctrl+b ,
-> para editar el nombre del terminal en la barra inferior.
Ctrl+b d
-> disociar la sesión, ósea, dejarla en segundo plano y volver al terminal.
Ctrl+b s
-> cambiar entre sesiones de tmux y selecciona la que te interesa.
Ctrl + b &
-> Destruir una ventana.
Ctrl+b f
-> Buscar una ventana por nombre.
Ctrl+b .
-> Cambiar el numero de índice de la ventana.
Ctrl+b ?
-> el modo ayuda donde muestra todos estos atajos de teclado.
La función de división de ventanas son los llamados paneles, estos son pseudo-terminales completos vinculados a una ventana. Esto significa que matar un panel también matará su pseudo-terminal y cualquier programa asociado que se ejecute dentro.
Para dividir una ventana horizontalmente, usamos Ctrl+b "
o bien use Ctrl+b %
para dividirlo verticalmente o, por último, Ctrl+b x
para destruir un panel.
Otros comandos de panel importantes:
Ctrl+b ↑ , ↓ , ← , →
para moverse entre paneles.Ctrl+b ;
pasar al último panel activo.Ctrl+b Ctrl+arrow key
cambiar el tamaño del panel en una línea.Ctrl+b Alt+arrow key
cambiar el tamaño del panel en cinco líneas.Ctrl+b {
intercambiar paneles (actual a anterior).Ctrl+b }
intercambiar paneles (actual a siguiente).Ctrl+b z
panel de acercar/alejar.Ctrl+b t
tmux muestra un reloj elegante dentro del panel (deténgalo presionando q).Ctrl+b !
convertir el panel en ventana.
screen
viene de GNU screen, el método de multiplexar ventanas usado para emular múltiples pantallas VT100 independientes en un solo terminal físico. Realmente es muy parecido a tmux
.
La pantalla se invoca escribiendo:
Primero verás un mensaje de bienvenida, presione la barra espaciadora
o Enter
para cerrar el mensaje y verás el símbolo del sistema ($
), puede parecer que no ha pasado nada, pero el hecho es que screen
ya ha creado y gestionado su primera sesión y ventana.
El prefijo de comando ahora es Ctrl+a
úsalo para ver todas las ventanas en la parte inferior de la pantalla del terminal, como ya hemos visto con tmux
, pulsa Ctrl+a w
:
Vamos con los atajos de teclado comunes:
Ctrl+a c
-> para crear otra ventana
Ctrl+a A
-> editar el nombre de la ventana actual
Ctrl+a n
-> ir a la ventana siguiente
Ctrl+a p
-> ir a la ventana anterior
Ctrl+a 0,1,2,3
-> ir al numero correspondiente
Ctrl+a "
-> ver listado de todas las ventanas
Ctrl+a k
-> finalizar ventana
Last updated