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/0qdEl 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 NginxEs 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) SIGTERMObserve 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
22123PKILL
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 pararSi 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 trabajadorTambié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 nginxsecLa 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.