Gestión de procesos de fondo bash

Gestión de procesos de fondo bash

Hay muchas veces cuando un desarrollador o usuario bash querrá ejecutar un proceso en segundo plano, ya sea desde la línea de comandos o desde el interior de un script bash, y luego manejar ese mismo proceso nuevamente más tarde. Hay varias herramientas de línea de comandos que permiten que uno lo haga. Ser capaz de comenzar, administrar y destruir procesos de fondo es un requisito para muchas tareas de nivel más avanzadas, especialmente en las áreas de scripting avanzado y control de procesos.

En este tutorial aprenderás:

  • Cómo comenzar, manejar y/o administrar, y destruir procesos de fondo
  • ¿Qué herramientas de línea de comandos están disponibles para ayudarlo con la gestión de procesos BASH?
  • Ejemplos que destacan el uso de procesos de fondo en la línea de comandos de Bash
Gestión de procesos de fondo bash

Requisitos y convenciones de software utilizados

Requisitos de software y convenciones de línea de comandos de Linux
Categoría Requisitos, convenciones o versión de software utilizada
Sistema Independiente de la distribución de Linux
Software Línea de comando bash, sistema basado en Linux
Otro Cualquier utilidad que no esté incluida en el shell bash de forma predeterminada se puede instalar utilizando sudo apt-get instalación de utilidad de utilidad (o yum instalación para sistemas basados ​​en redhat)
Convenciones # - requiere que los comandos de Linux se ejecuten con privilegios raíz directamente como un usuario raíz o mediante el uso de sudo dominio
$-Requiere que los comandos de Linux se ejecuten como un usuario regular no privilegiado

Ejemplo 1: Comenzar un proceso en segundo plano y traerlo de vuelta en primer plano

$ Sleep 1000 y [1] 25867 $ FG Sleep 1000 


Aquí comenzamos un proceso de sueño de 1000 segundos en segundo plano. Si queremos poner un proceso en segundo plano, podemos usar el ampersand (Y) firmar detrás de cualquier comando. Esto colocará el proceso en segundo plano e informará el Pid (ID de proceso, un número de identificador que identifica cualquier proceso que se ejecute en una máquina Linux). En este ejemplo, el Pid es 25867. Tenga en cuenta que el proceso se sigue funcionando cuando se coloca en segundo plano, lo que nos da lo mejor de ambos mundos; El proceso se está ejecutando y hacemos volver nuestra línea de comando mientras tanto! Excelente.

Luego colocamos el proceso en primer plano (como si nunca hubiera una instrucción de fondo) utilizando el FG (i.mi. primer plano) comando. El resultado es que vemos qué proceso se está colocando nuevamente en primer plano (yo.mi. dormir 1000) y nuestro símbolo del sistema no regresa cuando colocamos el sueño en primer plano y el símbolo del sistema solo volverá cuando se realice el sueño de 1000 segundos.

Digamos que colocamos el dormir 1000 en el fondo, realizó otro trabajo durante 500 segundos y luego se ejecutó FG... ¿Cuánto tiempo seguiría corriendo el sueño?? Si adivina (o sabes) 500 segundos, entonces tienes razón. Los primeros 500 segundos se pasaron funcionando como un proceso de fondo, y el segundo 500 será como un proceso de primer plano.

Tenga en cuenta también que si termina el shell su comando terminará, ya sea que se esté ejecutando en segundo plano o en primer plano (a menos que lo repudiera, más sobre esto en el siguiente ejemplo).

Ejemplo 2: repudiar un proceso

$ Sleep 1000 y [1] 26090 $ sin duda %1 $ 

Aquí comenzamos otros 1000 segundos de sueño, y nos informaron del PID del proceso de fondo como antes. A continuación ejecutamos Degoteo %1, referirse al primer proceso de fondo (como lo indica también el [1] Antes del pid!), e instruir a Bash a repudiar (disociar) este proceso desde el shell actual. No es que se disociará del usuario actual (y por ejemplo PS -EF | Grep Sleep | Grep -V Grep De hecho, todavía mostrará su ID de usuario), sino de la sesión de shell actual. Mirar:

$ Sleep 1000 y [1] 26214 $ sin duda %1 $ ps -ef | Grep Sleep | GREP -V GREP ROEL 26214 26120 0 13:13 pts/3 00:00:00 Sleep 1000 $ Salida 

Luego, abrir un nuevo shell y volver a ejecutar el PD Podemos ver que el comando todavía está allí y ahora está conectado a PPID (PID parentista) 1 en lugar de 26120 como PID de padre:

$ PS -EF | Grep Sleep | GREP -V GREP ROEL 26214 1 0 19:48 ? 00:00:00 sueño 1000 

Es como si el shell todavía estuviera funcionando (tenga en cuenta el 26214 PID sigue siendo activo/asociado con la carrera dormir), sin embargo, la línea de línea de comando activa se ha ido!

Genial, por lo que esto nos da una forma de disociar los procesos del shell actual y, por lo tanto, asegurarnos de que sigan funcionando cuando nuestra sesión de shell está cerrada.

Ejemplo 3: colocar un comando en el fondo

$ Sleep 1000 ^Z [1]+ Deting Sleep 1000 $ Bg %1 [1]+ Sleep 1000 y $ 

Aquí comenzamos un dormir 1000 en primer plano (no Y se usó), e interrumpió ese proceso con el atajo de teclado CTRL+Z. Tenga en cuenta que mientras la salida dice ^Z (y ^ es un símbolo para indicar CONTROL), el Z es en realidad un minúscula z, Entonces no necesitas usar CAMBIO, justo CTRL+Z.

Tenga en cuenta que el proceso realmente se detuvo, no continuó ejecutando. Ahora hemos colocado el proceso en segundo plano y lo hemos detenido. Para que este proceso continúe ejecutando ahora, tenemos dos opciones; FG %1 - i.mi. Coloque el proceso indicado por [1] volver al primer plano y continuar corriendo normalmente, o BG %1 que reanudará el proceso, pero en segundo plano. En el ejemplo podemos ver el último, y nuestro símbolo del sistema regresa como se esperaba.

Tenga en cuenta que lo anterior puede aumentarse ligeramente con renegar de, Hacer coincidir una forma a menudo utilizada de manejar un proceso cuando se usa un servidor remoto. Supongamos que está conectado a través de SSH a un servidor remoto y comenzó un trabajo grande, por ejemplo, una copia de seguridad o generación de informes. Ahora le gustaría salir de su oficina por el día, pero no está seguro de si su conexión SSH permanecerá en vivo toda la noche, e incluso si su computadora no hibernará o similar. Cualquiera de estas acciones podría poner en peligro el trabajo en ejecución!

En ese caso, puede hacer lo siguiente;

$ Sleep 1000 ^Z [1]+ Deting Sleep 1000 $ Bg %1 [1]+ Sleep 1000 y $ Sobleado %1 $ 


Y feliz y de forma segura, aleje de su computadora (después de bloquearla;), ya que puede estar seguro de eso, incluso si su conexión SSH falla, o su computadora hiberna, o la mujer de limpieza noquea el cable de alimentación, que su trabajo permanecerá correr. Como el proceso fue repudido/disociado de la sesión de shell actual, continuará ejecutándose incluso si la sesión de shell actual está terminada de alguna manera.

Una pequeña advertencia es que no puedes usar FG por la mañana para devolver el trabajo al primer plano, incluso si su conexión SSH y Shell nunca terminaron/fallaron:

$ FG BASH: FG: actual: no hay tal trabajo $ FG %1 Bash: FG: %1: No hay tal trabajo 

Cuando está repudiado, se disoció y se ha ido! Sin embargo, el trabajo seguirá funcionando en segundo plano, e incluso puedes matarlo usando su PID (como se puede observar desde PS -EF | Grep Your_Process_Name | Grep -V Grep.

Ejemplo 4: múltiples procesos de fondo y procesos de terminación

Primero comenzamos dos procesos en segundo plano utilizando nuestro confianza dormir 1000 ejemplo:

$ Sleep 1000 y [1] 27158 $ Sleep 1000 y [2] 27159 

Podemos ver aquí que dos procesos de fondo ([1] y [2], con Pid's 27158 y 27159 respectivamente) fueron iniciados. A continuación, matamos el primer proceso:

$ Kill %1 $ [1]- Sleep terminado 1000 $ 

Eso fue sencillo/fácil, correcto? Una pregunta que uno puede hacer es por qué la información terminada no se muestra inmediatamente (se requiere una prensa de entrada adicional como puede ver) y la razón es que el proceso no se terminó antes de que se devuelva la línea de comando. Como parte del trabajo que se realiza cada vez que se muestra una nueva línea de comandos, es informar sobre varios estados, incluido el estado del proceso de antecedentes si es necesario. Por lo tanto, cuando Enter fue presionado nuevamente (indicado por el vacío ps línea, se muestra un informe del proceso terminado.

Ejemplo 5: uno hecho antes del otro

Comencemos nuevamente dos procesos, pero esta vez el segundo proceso dormirá solo durante 3 segundos:

$ Sleep 1000 y [1] 27406 $ Sleep 3 y [2] 27407 $ 

Después de unos 5 segundos, presionando Enter, veremos:

$ [2]+ Hecho dormir 3 

¿Qué pasará ahora si usamos FG en este caso sin el original [1] especificador?

$ FG Sleep 1000 ^Z [1]+ Deting Sleep 1000 $ 


El primer proceso continuará! Este es también el caso si se usó el procedimiento inverso:

$ Sleep 10 y [1] 27346 $ Sleep 1000 y [2] 27347 $ [1]- Hecho Sleep 10 $ FG Sleep 1000 ^Z [2]+ Deting Sleep 1000 

El FG El comando siempre tomará el último comando que se colocó en el fondo (y que aún no se completó), y lo colocará en primer plano nuevamente.

Conclusión

En este artículo, observamos varios comandos, incluidos BG, FG y el entorno de fondo modificador y ampersand Y que se puede colocar después de cualquier comando para colocar ese comando en el fondo. También exploramos al usuario del matar comandar y analizar cómo abordar varios procesos de fondo utilizando el De % Idioma de bash con un número de proceso de fondo coincidente como %1 para [1] etc.

Si desea obtener más información sobre Bash en general, eche un vistazo a los útiles Consejos de la línea de comandos de bash y la serie de ejemplos.

Disfrute de sus nuevas habilidades Bash encontradas, y si hace algo genial con procesos de fondo, déjenos un comentario a continuación!

Tutoriales de Linux relacionados:

  • Una introducción a la automatización, herramientas y técnicas de Linux
  • Mastering Bash Script Loops
  • Bucles anidados en guiones Bash
  • Cosas para instalar en Ubuntu 20.04
  • Scripting de bash y gestión de procesos multiprocesos en el ..
  • Mint 20: Mejor que Ubuntu y Microsoft Windows?
  • Manejo de la entrada del usuario en scripts bash
  • Sistema colgado de Linux? Cómo escapar a la línea de comando y ..
  • Tutorial de depuración de GDB para principiantes
  • Cosas que hacer después de instalar Ubuntu 20.04 fossa focal Linux