Cómo usar ps, kill y nice para administrar procesos en Linux

Introducción

Un servidor Linux, como cualquier ordenador moderno, ejecuta múltiples aplicaciones. Estas se denominan y gestionan como procesos individuales .

Si bien Linux se encargará de la gestión de bajo nivel, detrás de escena, en el ciclo de vida de un proceso (es decir, inicio, apagado, asignación de memoria, etc.), necesitará una forma de interactuar con el sistema operativo para gestionarlos desde un nivel superior.

En esta guía, aprenderá algunos aspectos fundamentales de la gestión de procesos. Linux proporciona diversas herramientas estándar integradas para este propósito.

Explorarás estas ideas en un entorno Ubuntu 20.04, pero cualquier distribución moderna de Linux funcionará de manera similar.

Paso 1: Cómo ver los procesos en ejecución en Linux

Puede ver todos los procesos que se ejecutan en su servidor usando el topcomando:

top

Outputtop - 15:14:40 up 46 min,  1 user,  load average: 0.00, 0.01, 0.05
Tasks:  56 total,   1 running,  55 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1019600k total,   316576k used,   703024k free,     7652k buffers
Swap:        0k total,        0k used,        0k free,   258976k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
    1 root      20   0 24188 2120 1300 S  0.0  0.2   0:00.56 init               
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd           
    3 root      20   0     0    0    0 S  0.0  0.0   0:00.07 ksoftirqd/0        
    6 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0        
    7 root      RT   0     0    0    0 S  0.0  0.0   0:00.03 watchdog/0         
    8 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 cpuset             
    9 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 khelper            
   10 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kdevtmpfs          

Las primeras líneas de salida proporcionan estadísticas del sistema, como la carga de CPU/memoria y el número total de tareas en ejecución.

Puedes ver que hay 1 proceso en ejecución y 55 procesos que se consideran inactivos porque no están usando ciclos de CPU de forma activa.

El resto de la salida mostrada muestra los procesos en ejecución y sus estadísticas de uso. De forma predeterminada, topse ordenan automáticamente por uso de CPU, para que pueda ver primero los procesos más activos. topContinuará ejecutándose en su shell hasta que lo detenga usando la combinación de teclas estándar Ctrl+Cpara salir de un proceso en ejecución. Esto envía una killseñal que indica al proceso que se detenga correctamente si puede hacerlo.

Una versión mejorada de top, llamada htop, está disponible en la mayoría de los repositorios de paquetes. En Ubuntu 20.04, puedes instalarla con apt:

sudo apt install htop

Después de esto, el htopcomando estará disponible:

htop

Output  Mem[|||||||||||           49/995MB]     Load average: 0.00 0.03 0.05 
  CPU[                          0.0%]     Tasks: 21, 3 thr; 1 running
  Swp[                         0/0MB]     Uptime: 00:58:11

  PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
 1259 root       20   0 25660  1880  1368 R  0.0  0.2  0:00.06 htop
    1 root       20   0 24188  2120  1300 S  0.0  0.2  0:00.56 /sbin/init
  311 root       20   0 17224   636   440 S  0.0  0.1  0:00.07 upstart-udev-brid
  314 root       20   0 21592  1280   760 S  0.0  0.1  0:00.06 /sbin/udevd --dae
  389 messagebu  20   0 23808   688   444 S  0.0  0.1  0:00.01 dbus-daemon --sys
  407 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.02 rsyslogd -c5
  408 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.00 rsyslogd -c5
  409 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.00 rsyslogd -c5
  406 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.04 rsyslogd -c5
  553 root       20   0 15180   400   204 S  0.0  0.0  0:00.01 upstart-socket-br

htopProporciona una mejor visualización de múltiples hilos de CPU, mayor comprensión de la compatibilidad de colores en terminales modernas y más opciones de ordenación, entre otras funciones. A diferencia de [Nombre del programa] top, no siempre se instala por defecto, pero puede considerarse un reemplazo directo. Puedes salir htoppulsando [Nombre del programa Ctrl+C] con [ Nombre del programa] top. También puedes aprender más sobre cómo usar [Nombre del programa] y [Nombre del programa] .

En la siguiente sección, aprenderá cómo utilizar herramientas para consultar procesos específicos.

Paso 2: Cómo usar ps para enumerar procesos

topProporciona htopuna interfaz de panel para visualizar los procesos en ejecución, similar a un administrador de tareas gráfico. Una interfaz de panel puede ofrecer una visión general, pero no suele mostrar resultados directamente procesables. Para ello, Linux ofrece otro comando estándar para psconsultar los procesos en ejecución.

Ejecutar pssin ningún argumento proporciona muy poca información:

ps

Output  PID TTY          TIME CMD
 1017 pts/0    00:00:00 bash
 1262 pts/0    00:00:00 ps

Esta salida muestra todos los procesos asociados con el usuario y la sesión de terminal actuales. Esto es útil si actualmente solo se ejecuta el bashshell y este pscomando en esta terminal.

Para obtener una imagen más completa de los procesos en este sistema, puede ejecutar ps aux:

ps aux

OutputUSER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2  24188  2120 ?        Ss   14:28   0:00 /sbin/init
root         2  0.0  0.0      0     0 ?        S    14:28   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    14:28   0:00 [ksoftirqd/0]
root         6  0.0  0.0      0     0 ?        S    14:28   0:00 [migration/0]
root         7  0.0  0.0      0     0 ?        S    14:28   0:00 [watchdog/0]
root         8  0.0  0.0      0     0 ?        S<   14:28   0:00 [cpuset]
root         9  0.0  0.0      0     0 ?        S<   14:28   0:00 [khelper]
…

Estas opciones indican pscómo mostrar los procesos propiedad de todos los usuarios (independientemente de su asociación de terminal) en un formato más legible para humanos.

Al usar tuberías, puede buscar en la salida de ps auxusing greppara devolver el nombre de un proceso específico. Esto es útil si cree que ha fallado o si necesita detenerlo por alguna razón.

ps aux | grep bash

Outputsammy         41664   0.7  0.0 34162880   2528 s000  S     1:35pm   0:00.04 -bash
sammy         41748   0.0  0.0 34122844    828 s000  S+    1:35pm   0:00.00 grep bash

Esto devuelve tanto el grepproceso que acaba de ejecutar como el bashshell que se está ejecutando actualmente. También devuelve el uso total de memoria y CPU, su tiempo de ejecución y, en la salida resaltada arriba, su ID de proceso . En sistemas Linux y similares a Unix, a cada proceso se le asigna un ID de proceso o PID . Así es como el sistema operativo identifica y rastrea los procesos.

Una forma rápida de obtener el PID de un proceso es con el pgrepcomando:

pgrep bash

Output1017

Al primer proceso que se genera durante el arranque, llamado init , se le asigna el PID de “1”.

pgrep init

Output1

Este proceso es responsable de generar todos los demás procesos del sistema. A estos últimos se les asignan números PID mayores.

El padre de un proceso es el proceso responsable de generarlo. Los procesos padre tienen un PPID , que se puede ver en los encabezados de columna de muchas aplicaciones de gestión de procesos, como top, htopy ps.

Cualquier comunicación entre el usuario y el sistema operativo sobre procesos implica la conversión entre nombres de proceso y PID en algún momento de la operación. Por eso, estas utilidades siempre incluirán el PID en su salida. En la siguiente sección, aprenderá a usar PID para enviar señales de parada, reanudación u otras señales a los procesos en ejecución.

Paso 3: Cómo enviar señales a procesos en Linux

Todos los procesos en Linux responden a señales . Las señales son una forma, a nivel del sistema operativo, de indicar a los programas que finalicen o modifiquen su comportamiento.

La forma más común de pasar señales a un programa es mediante el killcomando. Como era de esperar, la función predeterminada de esta utilidad es intentar finalizar un proceso:

kill PID_of_target_process

Esto envía la señal TERM al proceso. Esta señal le indica que debe terminar. Esto permite que el programa realice operaciones de limpieza y finalice sin problemas.

Si el programa se comporta mal y no sale cuando se le da la señal TERM, puede escalar la señal pasando la KILLseñal:

kill -KILL PID_of_target_process

Esta es una señal especial que no se envía al programa.

En cambio, se le asigna al núcleo del sistema operativo, que detiene el proceso. Esto se utiliza para eludir a los programas que ignoran las señales que se les envían.

Cada señal tiene un número asociado que puede pasarse en lugar del nombre. Por ejemplo, puede pasar “-15” en lugar de “-TERM” y “-9” en lugar de “-KILL”.

Las señales no solo se utilizan para detener programas. También pueden utilizarse para realizar otras acciones.

Por ejemplo, muchos procesos diseñados para ejecutarse constantemente en segundo plano (a veces llamados “daemons”) se reiniciarán automáticamente al recibir la señal de HUPcolgar” . El servidor web Apache suele funcionar así.

sudo kill -HUP pid_of_apache

El comando anterior hará que Apache recargue su archivo de configuración y reanude el servicio de contenido.

Nota: Muchos procesos en segundo plano como este se gestionan mediante servicios del sistema que proporcionan una interfaz adicional para interactuar con ellos. Normalmente es preferible reiniciar el servicio en lugar de enviar una HUPseñal directamente a un proceso en ejecución. Si revisa los archivos de configuración de varios servicios, puede descubrir que los distintos service restartganchos están diseñados precisamente para eso: enviar señales a procesos específicos, además de proporcionar registros y otros informes.

Puedes enumerar todas las señales que se pueden enviar con killla -lbandera:

kill -l

Output1) 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

Aunque la forma convencional de enviar señales es mediante el uso de PID, también existen métodos para hacerlo con nombres de procesos regulares.

El pkillcomando funciona casi exactamente de la misma manera que kill, pero opera sobre un nombre de proceso:

pkill -9 ping

El comando anterior es equivalente a:

kill -9 `pgrep ping`

Si desea enviar una señal a cada instancia de un determinado proceso, puede utilizar el killallcomando:

killall firefox

El comando anterior enviará la señal TERM a cada instancia que firefoxse esté ejecutando en la computadora.

Paso 4 – Cómo ajustar las prioridades del proceso

A menudo, querrá ajustar qué procesos tienen prioridad en un entorno de servidor.

Algunos procesos pueden considerarse críticos para su situación, mientras que otros pueden ejecutarse cuando haya recursos sobrantes.

Linux controla la prioridad a través de un valor llamado niceness .

Las tareas de alta prioridad se consideran menos atractivas porque no comparten tantos recursos. Los procesos de baja prioridad, en cambio, son atractivos porque insisten en consumir solo los recursos mínimos.

Al principio del artículo, al ejecutarlo top, había una columna marcada como “NI”. Este es el valor del proceso:

top

[secondary_label Output] 
Tasks:  56 total,   1 running,  55 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1019600k total,   324496k used,   695104k free,     8512k buffers
Swap:        0k total,        0k used,        0k free,   264812k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
 1635 root      20   0 17300 1200  920 R  0.3  0.1   0:00.01 top                
    1 root      20   0 24188 2120 1300 S  0.0  0.2   0:00.56 init               
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd           
    3 root      20   0     0    0    0 S  0.0  0.0   0:00.11 ksoftirqd/0

Los valores agradables pueden oscilar entre -19/-20 (prioridad más alta) y 19/20 (prioridad más baja) dependiendo del sistema.

Para ejecutar un programa con un determinado valor nice, puedes usar el nicecomando:

nice -n 15 command_to_execute

Esto sólo funciona cuando se inicia un nuevo programa.

Para alterar el valor nice de un programa que ya se está ejecutando, se utiliza una herramienta llamada renice:

renice 0 PID_to_prioritize

Conclusión

La gestión de procesos es fundamental en Linux y resulta útil en casi cualquier contexto. Incluso si no se realiza ninguna administración práctica del sistema, es muy útil poder identificar procesos bloqueados y gestionarlos con cuidado.

A continuación, es posible que desee aprender a utilizar netstaty dusupervisar otros recursos del servidor .

Leave a Reply

Your email address will not be published. Required fields are marked *

Related Post