GNU/Linux >> Tutoriales Linux >  >> Linux

8 comandos de Linux para una gestión de procesos eficaz

Generalmente, el ciclo de vida de un proceso de aplicación tiene tres estados principales:iniciar, ejecutar y detener. Cada estado puede y debe ser administrado con cuidado si queremos ser administradores competentes. Estos ocho comandos se pueden usar para administrar procesos a lo largo de sus ciclos de vida.

Iniciando un proceso

La forma más fácil de iniciar un proceso es escribir su nombre en la línea de comando y presionar Enter. Si desea iniciar un servidor web Nginx, escriba nginx . Tal vez solo quiera comprobar la versión.

alan@estación de trabajo:~$ nginx

alan@estación de trabajo:~$ nginx -v
versión de nginx:nginx/1.14.0

Ver tu ruta ejecutable

La demostración anterior de iniciar un proceso asume que el archivo ejecutable se encuentra en su ruta ejecutable. Comprender esta ruta es clave para iniciar y administrar un proceso de manera confiable. Los administradores a menudo personalizan esta ruta para el propósito deseado. Puede ver la ruta de su ejecutable usando echo $PATH .

alan@estación de trabajo:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

CUÁL

Use el comando which para ver la ruta completa de un archivo ejecutable.

alan@workstation:~$ que nginx                                                    
/opt/nginx/bin/nginx

Usaré el popular software de servidor web Nginx para mis ejemplos. Supongamos que Nginx está instalado. Si el comando cuál nginx no devuelve nada, entonces no se encontró Nginx porque busca solo su ruta ejecutable definida. Hay tres formas de remediar una situación en la que un proceso no se puede iniciar simplemente por su nombre. El primero es escribir la ruta completa. Aunque preferiría no tener que escribir todo eso, ¿y tú?

alan@estación de trabajo:~$ /home/alan/web/prod/nginx/sbin/nginx -v
versión de nginx:nginx/1.14.0

La terminal de Linux

  • Los 7 mejores emuladores de terminal para Linux
  • 10 herramientas de línea de comandos para el análisis de datos en Linux
  • Descargar ahora:hoja de referencia de SSH
  • Hoja de trucos de comandos avanzados de Linux
  • Tutoriales de línea de comandos de Linux

La segunda solución sería instalar la aplicación en un directorio en la ruta de su ejecutable. Sin embargo, esto puede no ser posible, especialmente si no tiene privilegios de root.

La tercera solución es actualizar su variable de entorno de ruta ejecutable para incluir el directorio donde está instalada la aplicación específica que desea usar. Esta solución depende del shell. Por ejemplo, los usuarios de Bash necesitarían editar la línea PATH=en su archivo .bashrc.

PATH="$HOME/web/prod/nginx/sbin:$PATH" 

Ahora, repita su eco y qué comandos o intente verificar la versión. ¡Mucho más fácil!

alan@estación de trabajo:~$ echo $PATH
/home/alan/web/prod/nginx/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr /bin

alan@estación de trabajo:~$ que nginx
/home/alan/web/prod/nginx/sbin/nginx

alan@estación de trabajo:~$ nginx -v                                                
Versión de nginx:nginx/1.14.0

Mantener un proceso en ejecución

NOHUP

Es posible que un proceso no continúe ejecutándose cuando cierra sesión o cierra su terminal. Este caso especial se puede evitar precediendo el comando que desea ejecutar con el comando nohup . Además, agregar un ampersand (&) enviará el proceso a un segundo plano y le permitirá continuar usando la terminal. Por ejemplo, suponga que desea ejecutar myprogram.sh.

nohup myprogram.sh & 

Una cosa buena que hace nohup es devolver el PID del proceso en ejecución. Hablaré más sobre el PID a continuación.

Administrar un proceso en ejecución

La terminal de Linux

  • Los 7 mejores emuladores de terminal para Linux
  • 10 herramientas de línea de comandos para el análisis de datos en Linux
  • Descargar ahora:hoja de referencia de SSH
  • Hoja de trucos de comandos avanzados de Linux
  • Tutoriales de línea de comandos de Linux

Cada proceso recibe un número de identificación de proceso (PID) único. Este número es el que usamos para gestionar cada proceso. También podemos usar el nombre del proceso, como demostraré a continuación. Hay varios comandos que pueden verificar el estado de un proceso en ejecución. Echemos un vistazo rápido a estos.

PD

El más común es ps. La salida predeterminada de ps es una lista simple de los procesos que se ejecutan en su terminal actual. Como puede ver a continuación, la primera columna contiene el PID.

alan@workstation:~$ ps
PID TTY          TIME CMD
23989 pts/0    00:00:00 bash
24148 pts/0    00:00:00 ps

Me gustaría ver el proceso de Nginx que comencé anteriormente. Para hacer esto, le digo a ps que me muestre todos los procesos en ejecución (-e ) y una lista completa (-f ).

alan@workstation:~$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
raíz         1     0  0 Aug18 ? 00:00:10 /sbin/init splash
raíz         2     0  0 18 de agosto ? 00:00:00 [kthreadd]
raíz         4     2  0 18 de agosto ? 00:00:00 [kworker/0:0H]
raíz         6     2  0 18 de agosto ? 00:00:00 [mm_percpu_wq]
raíz         7     2  0 18 de agosto ? 00:00:00 [ksoftirqd/0]
raíz         8     2  0 18 de agosto ? 00:00:20 [rcu_sched]
raíz         9     2  0 18 de agosto ? 00:00:00 [rcu_bh]
raíz        10     2  0 18 de agosto ? 00:00:00 [migración/0]
root        11     2  0 Aug18 ? 00:00:00 [perro guardián/0]
raíz        12     2  0 18 de agosto ? 00:00:00 [cpuhp/0]
raíz        13     2  0 18 de agosto ? 00:00:00 [cpuhp/1]
raíz        14     2  0 18 de agosto? 00:00:00 [perro guardián/1]
raíz        15     2  0 18 de agosto ? 00:00:00 [migración/1]
root        16     2  0 Aug18 ? 00:00:00 [ksoftirqd/1]
alan     20506 20496  0 10:39 pts/0    00:00:00 bash
alan     20520  1454  0 10:39 ? 00:00:00 nginx:proceso maestro nginx
alan     20521 20520  0 10:39 ? 00:00:00 nginx:proceso de trabajo
alan     20526 20506  0 10:39 pts/0    00:00:00 man ps
alan     20536 20526  0 10:39 pts/0    00:00:00 buscapersonas
alan     20564 20496  0 10:40 pts/1    00:00:00 bash

Puede ver los procesos de Nginx en la salida del comando ps anterior. El comando mostraba casi 300 líneas, pero lo acorté para esta ilustración. Como puede imaginar, tratar de manejar 300 líneas de información de proceso es un poco complicado. Podemos canalizar esta salida a grep para filtrar nginx.

alan@estación de trabajo:~$ ps -ef |grep nginx
alan     20520  1454  0 10:39 ? 00:00:00 nginx:proceso maestro nginx
alan     20521 20520  0 10:39 ? 00:00:00 nginx:proceso de trabajo

Eso es mejor. Podemos ver rápidamente que Nginx tiene PID de 20520 y 20521.

PGREP

El comando pgrep se creó para simplificar aún más las cosas al eliminar la necesidad de llamar a grep por separado.

alan@estación de trabajo:~$ pgrep nginx
20520
20521

Suponga que se encuentra en un entorno de alojamiento en el que varios usuarios ejecutan varias instancias diferentes de Nginx. Puede excluir a otros de la salida con -u opción.

alan@estación de trabajo:~$ pgrep -u alan nginx
20520
20521

PIDOF

Otro ingenioso es pidof. Este comando verificará el PID de un binario específico incluso si se está ejecutando otro proceso con el mismo nombre. Para configurar un ejemplo, copié mi Nginx en un segundo directorio y lo inicié con el prefijo establecido en consecuencia. En la vida real, esta instancia podría estar en una ubicación diferente, como un directorio propiedad de un usuario diferente. Si ejecuto ambas instancias de Nginx, el ps -ef la salida muestra todos sus procesos.

alan@workstation:~$ ps -ef |grep nginx
alan     20881  1454  0 11:18 ? 00:00:00 nginx:proceso maestro ./nginx -p /home/alan/web/prod/nginxsec
alan     20882 20881  0 11:18 ? 00:00:00 nginx:proceso de trabajo
alan     20895  1454  0 11:19 ? 00:00:00 nginx:proceso maestro nginx
alan     20896 20895  0 11:19 ? 00:00:00 nginx:proceso de trabajo

El uso de grep o pgrep mostrará números PID, pero es posible que no podamos discernir qué instancia es cuál.

alan@estación de trabajo:~$ pgrep nginx
20881
20882
20895
20896

El comando pidof se puede usar para determinar el PID de cada instancia específica de Nginx.

alan@estación de trabajo:~$ pidof /home/alan/web/prod/nginxsec/sbin/nginx
20882 20881

alan@estación de trabajo:~$ pidof /home/alan/ web/prod/nginx/sbin/nginx
20896 20895

ARRIBA

El comando superior existe desde hace mucho tiempo y es muy útil para ver los detalles de los procesos en ejecución e identificar rápidamente problemas como el acaparamiento de memoria. Su vista predeterminada se muestra a continuación.

arriba - 11:56:28 hasta 1 día, 13:37, 1 usuario, promedio de carga:0,09, 0,04, 0,03
Tareas:292 en total, 3 en ejecución, 225 durmiendo, 0 detenido, 0 zombi
%Cpu(s): 0.1 us, 0.2 sy, 0.0 ni,  99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem:16387132 total, 10854648 gratis, 1859036 usado, 3673448 mejorado /caché
Intercambio de KiB:       0 total,        0 gratis,        0 usado. 14176540 disponible MEM

PID USUARIO PR NI VTR RESR SR STOR CPU% MEM Time + Comando
17270 Alan 20 0 3930764 247288 98992 R 0.7 1.5 5:58.22 Gnome-Shell
20496 Alan 20 0 816144 45416 29844 S 0.5 0.3 0:22.16 Gnome-terminal -
21110 Alan 20 0 41940 3988 3188 R 0.1 0.0 0:00.17 Top
1 raíz 20 0 225564 9416 6768 S 0.0 0.1 0:10.72 Systemd
2 raíz 20 0 0 0 0 S 0.0 0.0 0:00.01 KTHREADD
4 raíz 0 -20 0 0 0 i 0.0 0.0 0:00.00 kworker / 0:0h
6 root 0 -20       0      0      0 I   0.0  0.0   0:00.00 mm_percpu_wq
    7 raíz      20   0       0      0       0 S   0.0  0.0   0:00.08 kd/0qd

El intervalo de actualización se puede cambiar escribiendo la letra s seguido de la cantidad de segundos que prefiere para las actualizaciones. Para que sea más fácil monitorear nuestros procesos Nginx de ejemplo, podemos llamar a top y pasar los PID usando -p opción. Esta salida es mucho más limpia.

alan@workstation:~$ top -p20881 -p20882 -p20895 -p20896

Tareas:  4 en total,   0 en ejecución,   4 en reposo,   0 detenido,   0 zombie
%Cpu(s) ):2,8 us, 1,3 sy, 0,0 ni, 95,9 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
KiB Mem :16387132 total, 10856008 gratis, 1857648 usado, 3673476 buff/cache
KiB Intercambio:       0 total,        0 gratis,        0 usado. 14177928 Disponible MEM

PID USUARIO PR NI VTRES RES SHR S% CPU% MEM Time + Comando
20881 Alan 20 0 12016 348 0 s 0.0 0.0 0:00.00 Nginx
20882 Alan 20 0 12460 1644 932 S 0.0 0.0 0:00.00 Nginx
20895 Alan 20 0 12016 352 0 s 0.0 0.0 0:00.00 Nginx
20896 Alan 20 0 12460 1628 912 S 0.0 0.0 0:00.00 Nginx

Es importante determinar correctamente el PID al administrar procesos, particularmente al detener uno. Además, si usa top de esta manera, cada vez que se detenga uno de estos procesos o se inicie uno nuevo, se deberá informar a top de los nuevos.

Deteniendo un proceso

MATAR

Curiosamente, no hay comando de parada. En Linux, existe el comando matar. Kill se utiliza para enviar una señal a un proceso. La señal más utilizada es "terminar" (SIGTERM) o "matar" (SIGKILL). Sin embargo, hay muchos más. A continuación se muestran algunos ejemplos. La lista completa se puede mostrar con kill -L .

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV 1    SIG PI 14) SIGALRM     15) SIGTERM

Observe que la señal número nueve es SIGKILL. Por lo general, emitimos un comando como matar -9 20896 . La señal predeterminada es 15, que es SIGTERM. Tenga en cuenta que muchas aplicaciones tienen su propio método para detenerse. Nginx usa una -s opción para pasar una señal como "detener" o "recargar". En general, prefiero usar el método específico de una aplicación para detener una operación. Sin embargo, demostraré el comando kill para detener el proceso Nginx 20896 y luego confirmaré que se detuvo con pgrep. El PID 20896 ya no aparece.

alan@estación de trabajo:~$ kill -9 20896
 
alan@estación de trabajo:~$ pgrep nginx
20881
20882
20895
22123

PKILL

El comando pkill es similar a pgrep en que puede buscar por nombre. Esto significa que debe tener mucho cuidado al usar pkill. En mi ejemplo con Nginx, es posible que no elija usarlo si solo quiero eliminar una instancia de Nginx. Puedo pasar la opción Nginx -s detener a una instancia específica para matarlo, o necesito usar grep para filtrar la salida completa de ps.

/home/alan/web/prod/nginx/sbin/nginx -s parar

/home/alan/web/prod/nginxsec/sbin/nginx -s parar

Si quiero usar pkill, puedo incluir -f opción para pedirle a pkill que filtre el argumento completo de la línea de comando. Esto, por supuesto, también se aplica a pgrep. Entonces, primero puedo verificar con pgrep -a antes de emitir el pkill -f .

alan@workstation:~$ pgrep -a nginx
20881 nginx:proceso maestro ./nginx -p /home/alan/web/prod/nginxsec
20882 nginx:proceso de trabajo
20895 nginx:proceso maestro nginx
20896 nginx:proceso trabajador

También puedo reducir mi resultado con pgrep -f . El mismo argumento usado con pkill detiene el proceso.

alan@estación de trabajo:~$ pgrep -f nginxsec
20881
                                           
alan@estación de trabajo:~$ pkill -f nginxsec

La clave para recordar con pgrep (y especialmente con pkill) es que debe estar siempre seguro que el resultado de su búsqueda sea preciso para que no esté afectando involuntariamente los procesos incorrectos.

La mayoría de estos comandos tienen muchas opciones de línea de comandos, por lo que siempre recomiendo leer la página de manual de cada uno. Si bien la mayoría de estos existen en plataformas como Linux, Solaris y BSD, existen algunas diferencias. Siempre pruebe y esté listo para corregir según sea necesario cuando trabaje en la línea de comando o escriba scripts.


Linux
  1. Mis comandos favoritos de Linux para optimizar imágenes web

  2. 20 comandos esenciales de Linux para cada usuario

  3. Hoja de trucos para los comandos comunes de Linux

  4. Comandos de Linux:cómo manipular la prioridad del proceso

  5. Process Monitor equivalente para Linux?

¿Cómo matar un proceso en Linux? Comandos para Terminar

Los 30 mejores ejemplos de comandos para monitorear en Linux

Los mejores comandos de Linux para administradores de sistemas

Gestión de procesos de Linux mejorada con htop

Comandos de gestión de grupos en Linux

Comandos para la Gestión de Procesos en Linux