¿Cuál es un ejemplo práctico del uso del comando suspender en Bash?

12

suspendes un comando incorporado en Bash. ¿Cuándo utilizaría este comando de forma natural y lo encontraría útil?

igor
fuente
1
El shell se suspende cada vez que bifurca un proceso secundario, es decir, ejecuta un comando donde dicho comando es un programa externo, que requiere una fork/execllamada al sistema
the_velour_fog
1
En un shell interactivo, esto permite que el proceso secundario obtenga el control del terminal, sin que el shell principal interactúe con el terminal, lo que se vuelve desordenado.
the_velour_fog
2
@velour, pero eso no requiere ejecutar un comando separado para ese efecto?
ilkkachu
@the_velour_fog Técnicamente, el shell principal no se suspende (no recibe STOPseñal) cuando bifurca un proceso secundario. También estoy un poco confundido por tu segundo comentario.
Kusalananda
1
@Kusalananda ok, lo correcto me wait()parece razonable. Dije que el shell se suspende cada vez que bifurca un proceso secundario . No dije nada acerca de recibir señales de alto, eso no tendría sentido.
the_velour_fog

Respuestas:

14

Digamos que te faltan tanto GNU screencomo tmux(y X11, y consolas virtuales) pero quieres cambiar entre un shell de inicio de sesión y otro shell interactivo.

Primero debe iniciar sesión en la consola y luego iniciar un nuevo shell, bloqueando temporalmente el shell de inicio de sesión. Para recuperar el shell de inicio de sesión y hacer un trabajo allí, lo haría suspend. Luego, debería fgrecuperar el shell interactivo para continuar con lo que sea que haya hecho allí.

De hecho, con el control de trabajos, el shell de inicio de sesión podría generar una serie de shells interactivos como trabajos de fondo con los que podría cambiar fg %1, fg %2etc., pero para volver al shell de inicio de sesión, necesitaría usarlo a suspendmenos que lo deseara manualmente kill -s STOP $$.

También tenga en cuenta que Ctrl+ Zen el indicador en un shell interactivo no lo suspenderá.

EDITAR: Inicialmente tenía una larga sección hipotética sobre el uso de suspendun script, pero dado que el comando requiere control de trabajo y dado que los shells no interactivos generalmente no tienen control de trabajo, eliminé esa sección.


Sección eliminada con suspendreemplazada por kill -s STOP $$(esto realmente ya no pertenece a la respuesta, pero puede ser interesante para otros de todos modos):

Supongamos que tiene un proceso en segundo plano (un guión) en un guión, y que este proceso en segundo plano en algún momento debe detenerse y esperar a que el proceso padre le indique que continúe. Esto podría ser para que el padre tenga tiempo de extraer y mover archivos a su lugar o algo así.

El script secundario suspendería ( kill -s STOP $$), y el script primario le enviaría una CONTseñal cuando estaba bien continuar.

Le brinda la oportunidad de implementar una especie de sincronización entre un proceso padre y un proceso hijo (aunque es muy básico ya que el proceso de shell padre necesita más o menos adivinar que el proceso hijo está suspendido, aunque esto se puede solucionar haciendo que el hijo atrapar CONTy no suspender si esa señal se recibe demasiado pronto).

Kusalananda
fuente