Comandos para Gestionar Procesos en Linux

Comandos para gestionar procesos en Linux

Hemos venido agrupando algunos comandos en categorías (algunos para redes, otros para diagnostico), y usarlos según nuestro contexto en la administración de infraestructura. Ahora vamos a repasar algunos comandos para gestionar procesos en Linux.

En Informática, un proceso es básicamente un binario en ejecución (corriendo en memoria RAM). Puede que ese binario sea de un programa ejecutado por un usuario, tal como Firefox, LibreOffice, una calculadora. También existe otro tipo de proceso, que no es controlado por el usuario directamente, o sea, el usuario no puede verlo a simple vista, es algo que se ejecuta en segundo plano, y en sistemas basados en Unix/Linux podemos referirnos a él como “daemon”, o “demonio”. Veamos como gestionarlos.

Visualizar procesos en ejecución en Linux


Los siguientes tres comandos son los más usados para visualizar procesos en Linux

ps ó top ó htop

La diferencia entre ps y htop es que el primero nos da un resultado estático, mientras que el segundo proporciona una salida dinámica. Sin embargo, ps nos puede proporcionar funciones que top o htop no nos puede dar. Sea como sea, estos comandos muestran la información de los procesos en una estructura similar entre ellos, y que en el caso del comando ps se organiza así:

PID TTY TIME CMD

PID = Id o identificación única del proceso
TTY= La terminal donde se empezó el proceso
TIME = Eltiempo de cpu que se usó hasta el momento
CMD = y el comando o binario que está actuando

Visualizar todos los Procesos

sudo ps -A

Agregando la opción -l al comando ps se mostrarán distintas informaciones acerca de los procesos actualmente en marcha, incluyendo el estado de cada proceso. Los códigos utilizados para mostrar estos estados son los siguientes:

  • O – El proceso está ejecutándose en un procesador.
  • S – Durmiendo: el proceso espera a que ocurra un acontecimiento o suceso.
  • R – Ejecutable: el proceso está en la cola de ejecución.
  • I – Ocioso: el proceso está siendo creado.
  • Z – Autómata: el proceso ha terminado y no hay proceso maestro esperando.
  • T – Rastreado: proceso detenido por una señal porque el proceso maestro lo está rastreando.
  • X – SXBRK: el proceso está esperando más memoria primaria.

Localizar los binarios y otros archivos de un proceso

sudo ps -fea | grep “proceso”

Por ejemplo, si aplicamos el anterior comando al proceso de Squid Proxy, ps nos mostrará la ubicación de su binario, el proceso como tal en memoria y el archivo que está trabajando

La opción -fea del comando ps también puede mostrarnos si el binario desciende de un proceso padre, por ejemplo un script bash ejecutado… con bash.

Obtener el ID de un proceso por nombre

sudo pidof PROCESS_NAME
sudo ps -aux | grep PROCESS_NAME
sudo kill -p PROCESS_NAME
sudo kill --pid PROCESS_NAME

Monitorear un solo proceso

top -p PID

Manipular procesos en Linux


Con Manipular procesos en Linux me refiero a pausarlo, reanudarlo, enviarlo a segundo plano y volver a traerlo a primer plano.

Para que se haga notar el siguiente ejercicio, creamos un archivo cualquiera de 1 GB de tamaño, y lo pasamos por un proceso de compresión. Lo que haremos durante el proceso de compresión es pausarlo y enviarlo a segundo plano.

sudo dd if=/dev/urandom of=sample.txt bs=1M count=1024 iflag=fullblock
tar cvfz sample.tar.gz sample.txt (comprimimos)
Control + z (con el teclado pausamos el proceso de comprensión)
jobs (visualizamos los procesos que hemos detenido o pausado)
bg (de background, enviamos a segundo plano el proceso de compresión)

Al enviar el proceso a background, o segundo plano, este reanuda su ejecución automáticamente.

Matar procesos en Linux


La acción de matar procesos en Linux se refiere a terminar su ejecución, quitarlos de la RAM, que ya no los necesitamos funcionando. Cuando cerramos un programa en Linux, su binario en ejecución recibe la señal SIGTERM de Linux.

Desde la línea de comandos podemos enviar la señal SIGTERM a un proceso por medio del comando kill, así

sudo kill PID

Si nuestro proceso se niega a terminar, podemos elevar la contundencia con:

sudo kill -9 PID

Señal Zero

Hay otra señal que es compatible con la mayoría de los sistemas, pero que no aparece en el comando «kill -l». Esta es la señal «0» que se llama «SIGT». Esta señal se usa para ver si el usuario puede enviar señales al PID / proceso especificado. Por ejemplo, si un usuario posee un proceso y el proceso se está ejecutando, el comando «kill -0 PID» devolverá «0». Sin embargo, si el usuario no posee el PID especificado o el PID no está asignado a un proceso, el valor de retorno es «1».

Procesos zombies

No es porque sea el mes de octubre en que redacté estas líneas, pero explicar estos temas de “demonios, matar demonios, enviarlos a otro plano” y ese tipo de cosas, me pareció una divertida coincidencia que requiere hablar de un proceso especial llamado Proceso Zombie (aunque otras literaturas prefieren llamarlo ‘autómata’). Puedes ampliar más sobre procesos zombies en este mismo blog.

Terminar con un proceso zombi en Linux

Ubicar Procesos

fuser es una utilidad de línea de comandos simple, pero poderosa, diseñada para ubicar procesos en función de los archivos, directorios o sockets, a los que accede un proceso en particular. En resumen, ayuda a un usuario del sistema a identificar procesos usando archivos o sockets.

Si hay un proceso utilizando algún archivo dentro de una ruta que necesitamos desmontar, nos será reportado un error por éste hecho. Para comprobar quién es, se utiliza el siguiente comando:

sudo fuser -va /media/montaje

A continuación tenemos un ejemplo de la lista de ficheros y el proceso que los tiene abiertos

sudo fuser -u /var/log/*

Con el siguiente comando podemos identificar el proceso que ha abierto determinado puerto, por ejemplo el 8080

sudo fuser -v -n tcp 8080

Aunque el comando netstat -putan | grep :8080 nos puede dar un resultado parecido.

Comandos para gestionar procesos en Linux – Señalización de procesos


Todos los comandos que hemos visto hasta ahora, acuden a un recurso llamado Señalización de Procesos, comprendido por un set de señales que nos permiten gestionar procesos en Linux, tal como lo acabamos de ver. Estas son las señales:

  1. SIGHUP = la señal SIGHUP desconecta un proceso del proceso principal. Esto también se puede utilizar para reiniciar procesos. Por ejemplo, «killall -SIGHUP compiz» reiniciará Compiz. Esto es útil para demonios con pérdidas de memoria.
  2. SIGINT = señal de interrupción enviada por el usuario con las teclas CTRL + C. Hay procesos que pueden ignorar esta señal.
  3. SIGQUIT = Emitido si el usuario envía una señal de salida con las teclas Ctrl + D. Es como SIGINT con la capacidad de hacer que el proceso produzca un volcado del núcleo.
  4. SIGILL = cuando un proceso realiza una función defectuosa, prohibida o desconocida, el sistema envía la señal SIGILL al proceso.
  5. SIGTRAP = esta señal se utiliza con fines de depuración. Cuando un proceso ha realizado una acción o se cumple una condición que un depurador está esperando, esta señal se enviará al proceso.
  6. SIGABRT = esta señal de apagado es la señal de cancelación. Típicamente, un proceso iniciará esta señal de muerte en sí mismo.
  7. SIGBUS = cuando un proceso envía la señal SIGBUS, es porque el proceso causó un error de bus. Comúnmente, estos errores de bus se deben a un proceso que intenta utilizar direcciones físicas falsas o el proceso tiene su alineación de memoria configurada incorrectamente.
  8. SIGFPE = Emitido si se intenta una operación matemática ilegal, como dividir entre cero.
  9. SIGKILL = comando kill -9 . Puede dejar residuos.
  10. SIGUSR1 = indica una condición definida por el usuario. El usuario puede configurar esta señal programando los comandos en sigusr1.c. Esto requiere que el programador sepa C / C ++.
  11. SIGSEGV = cuando una aplicación tiene una violación de segmentación, esta señal se envía al proceso.
  12. SIGUSR2 = indica una condición definida por el usuario.
  13. SIGPIPE = cuando un proceso intenta escribir en una tubería que carece de un extremo conectado a un lector, esta señal se envía al proceso. Un lector es un proceso que lee datos al final de una tubería.
  14. SIGALRM = Señal de alarma (utilizada para temporizadores).
  15. SIGTERM = comando kill. Esta señal solicita un proceso para dejar de ejecutarse. Esta señal puede ser ignorada. El proceso tiene tiempo para apagarse con gracia. Cuando un programa se cierra con gracia, eso significa que se le da tiempo para guardar su progreso y liberar recursos. En otras palabras, no está obligado a detenerse. SIGINT es muy similar a SIGTERM.
  16. SIGSTKFLT
  17. SIGCHLD = cuando un proceso padre pierde su proceso hijo, el proceso padre recibe la señal SIGCHLD. Esto limpia los recursos utilizados por el proceso secundario. En las computadoras, un proceso hijo es un proceso iniciado por otro proceso conocido como padre.
  18. SIGCONT = para que los procesos continúen ejecutándose después de ser pausados por la señal
  19. SIGTSTP o SIGSTOP, envíe la señal SIGCONT al proceso pausado. Esta señal es beneficiosa para el control de trabajos de Unix (ejecución de tareas en segundo plano).
  20. SIGSTOP = esta señal hace que el sistema operativo pause la ejecución de un proceso. El proceso no puede ignorar la señal.
  21. SIGTSTP = esta señal es como presionar ctrl-z. Esto hace una solicitud al terminal que contiene el proceso para pedirle que se detenga temporalmente. El proceso puede ignorar la solicitud.
  22. SIGTTIN = cuando un proceso intenta leer desde un tty (terminal de computadora), el proceso recibe esta señal.
  23. SIGTTOU = cuando un proceso intenta escribir desde un tty (terminal de computadora), el proceso recibe esta señal.
  24. SIGURG = cuando un proceso tiene datos urgentes para leer o los datos son muy grandes, la señal SIGURG se envía al proceso.
  25. SIGXCPU = cuando un proceso usa la CPU más allá del tiempo asignado, el sistema envía al proceso esta señal. SIGXCPU actúa como una advertencia; el proceso tiene tiempo para guardar el progreso (si es posible) y cerrar antes de que el sistema mate el proceso con SIGKILL.
  26. SIGXFSZ = los sistemas de archivos tienen un límite en cuanto al tamaño de un archivo. Cuando un programa intenta violar este límite, el sistema enviará a ese proceso la señal SIGXFSZ (por ejemplo el limite de 4 GB de FAT32).
  27. SIGVTALRM = se envía cuando transcurre el tiempo de CPU utilizado por el proceso.
  28. SIGPROF = se envía cuando transcurre el tiempo de CPU utilizado por el proceso y por el sistema en nombre del proceso.
  29. SIGWINCH = cuando un proceso se encuentra en un terminal que cambia su tamaño, el proceso recibe esta señal.
  30. SIGIO
  31. SIGPWR = los fallos de alimentación harán que el sistema envíe esta señal a los procesos (si el sistema todavía está encendido).
  32. SIGSYS = los procesos que otorgan a una llamada del sistema un parámetro no válido recibirán esta señal.
  33. SIGRTMIN = este es un conjunto de señales que varía entre sistemas. Están etiquetados SIGRTMIN + 1, SIGRTMIN + 2, SIGRTMIN + 3, ……. y así sucesivamente (generalmente hasta 15). Estas son señales definidas por el usuario; deben programarse en el código fuente del kernel de Linux. Eso requeriría que el usuario conozca C / C ++.
  34. SIGRTMAX = este es un conjunto de señales que varía entre sistemas. Están etiquetados como SIGRTMAX-1, SIGRTMAX-2, SIGRTMAX-3, ……. y así sucesivamente (generalmente hasta 14). Estas son señales definidas por el usuario; deben programarse en el código fuente del kernel de Linux. Eso requeriría que el usuario conozca C / C ++.
  35. SIGEMT: los procesos reciben esta señal cuando se produce una captura de emulador.
  36. SIGINFO: las terminales a veces pueden enviar solicitudes de estado a los procesos. Cuando esto sucede, los procesos también recibirán esta señal.
  37. SIGLOST: los procesos que intentan acceder a archivos bloqueados recibirán esta señal. Muchos sistemas usan SIGLOST como un alias para SIGPOLL, especialmente porque acceder a archivos bloqueados es un evento de E / S asíncrono.

Podemos ver la tabla de las señales definidas en Linux, con el siguiente comando (para kernel 4.4)

cat /usr/include/asm-generic/signal.h

Valora este artículo

Comandos para gestionar procesos en Linux
5,0 rating based on 12.345 ratings
Overall rating: 5 out of 5 based on 1 reviews.
Nombres
Email
Titulo
Calificanos
Contenido

super

★★★★★
“ Muy bueno, excelente”
- Andres Mauricio Posso
Comparte esto en
Publicado en GNU Linux.

3 Comentarios

  1. Pingback: 🥇 Proceso zombi o proceso defunct en Linux - Terminar proceso zombi

  2. Pingback: 🥇 Servidor Proxy con Squid en Ubuntu - Linux - Control de navegación

  3. Pingback: 🥇 Principales comandos de Linux - Comprimir Ficheros Directorios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *