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 top
comando:
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, top
se ordenan automáticamente por uso de CPU, para que pueda ver primero los procesos más activos. top
Continuará ejecutándose en su shell hasta que lo detenga usando la combinación de teclas estándar Ctrl+C
para salir de un proceso en ejecución. Esto envía una kill
señ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 htop
comando 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
htop
Proporciona 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 htop
pulsando [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
top
Proporciona htop
una 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 ps
consultar los procesos en ejecución.
Ejecutar ps
sin 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 bash
shell y este ps
comando 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 ps
có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 aux
using grep
para 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 grep
proceso que acaba de ejecutar como el bash
shell 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 pgrep
comando:
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
, htop
y 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 kill
comando. 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 KILL
señ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 HUP
” colgar” . 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 HUP
señal directamente a un proceso en ejecución. Si revisa los archivos de configuración de varios servicios, puede descubrir que los distintos service restart
ganchos 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 kill
la -l
bandera:
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 pkill
comando 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 killall
comando:
killall firefox
El comando anterior enviará la señal TERM a cada instancia que firefox
se 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 nice
comando:
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 netstat
y du
supervisar otros recursos del servidor .