Coloque el trabajo en segundo plano sin congelar

9

Digamos que comienzas el trabajo así

foo

y luego deseas que quieras colocarlo en segundo plano. Escribiendo Ctrl+ Zy luego bgfunciona, pero se congelará fooentre Ctrl+ Zy bg. ¿Cómo puedo colocar foo en el fondo sin congelarlo primero?

user877329
fuente
77
¿Cuál es el caso de uso? ¿Por qué es un problema que el proceso se congele por poco tiempo?
l0b0

Respuestas:

4

Técnicamente fooya se ejecuta en segundo plano. Puede iniciar una segunda sesión de terminal, y la primera continuará ejecutándose foomientras hace otras cosas.

En X, esto simplemente implica iniciar una segunda aplicación de terminal, o abrir otra pestaña si su emulador de terminal de elección tiene tales características.

En la consola, si no lo planeó, necesitaría cambiar a un terminal virtual diferente e iniciar sesión nuevamente.

Si utiliza un terminal multiplexor como screeno tmuxpuede iniciar otra sesión dentro de él. Por ejemplo, en la pantalla, esto se hace usando Ctrl+ Ainmediatamente seguido de Ctrl+ C. Para cambiar entre ellos, use Ca Cn y Ca Cp para ir y venir entre sesiones de terminal.

un CVn
fuente
Es decir, no es posible en bash.
user877329
1
Esta respuesta parece estar basada en un malentendido del concepto de un trabajo de fondo. Un terminal tiene un atributo de "grupo de procesos en primer plano", generalmente establecido por el shell, que hace que los procesos en ese grupo puedan leer desde el terminal y recibir señales relacionadas con tty como SIGINT. Todos los procesos que se ejecutan en el terminal que no están en el grupo de procesos en primer plano son procesos en segundo plano. Cuando crea un nuevo terminal, el trabajo en primer plano del terminal original sigue siendo el trabajo en primer plano en ese terminal, incluso si no lo está mirando.
@ WumpusQ.Wumbley El punto de mi respuesta es que la mayoría (¿todos?) De los sistemas que pueden ejecutar bash son multitarea por su propia naturaleza. En dicho sistema, incluso si un proceso tiene, digamos, enfoque de entrada, no hay nada intrínsecamente "en primer plano" sobre el proceso mismo; foo a sí mismo (en ausencia de una verificación específica, que supongo que en la naturaleza está en algún lugar entre raro e inexistente) no le importa si se está ejecutando en la ventana superior o incluso si hay algo que muestra su salida.
un CVn
1
mi punto es que cuando la pregunta menciona específicamente las palabras "antecedentes" y "trabajo", los cuales son términos técnicos con significados definidos por el marco del grupo de procesos POSIX, así como los mecanismos de Ctrl-Z y bg, los cuales opere en grupos de procesos, y su respuesta sugiere que no use la funcionalidad del grupo de procesos, y use la palabra "fondo" de una manera que no coincida con su definición real, no está ajustando su respuesta a la pregunta. Y para comenzar con "Técnicamente fooya se ejecuta en segundo plano" ... solo ... No. Técnicamente.
@ WumpusQ.Wumbley De alguna manera no creo que el OP leyó el estándar POSIX y pensó "hmm, me gustaría usar esto, pero ya empecé, foo¿qué hago ahora?". Si cree que esta respuesta (u otras respuestas) no es útil para responder la pregunta, le animo a que ejerza sus privilegios de voto , así como a dejar su propia respuesta respondiendo a la pregunta desde el punto de vista que considere correcto. discutiendo sobre una de las respuestas que quedan en la pregunta. Tal vez sienta que, por ejemplo, la respuesta de l0b0 es mejor, pero mi respuesta ofrece una manera de hacer al menos aproximadamente lo que quiere el OP.
un CVn
3

Agregar un &signo después del comando ( foo &) lo pondrá en segundo plano de inmediato. Pero creo que no hay forma, en una configuración estándar de terminal / shell, de poner en segundo plano algo inmediatamente una vez que está en primer plano.

l0b0
fuente
3

Enviar una aplicación desde el primer plano hasta el fondo requiere la cooperación tanto del terminal como del shell. El terminal no puede hacerlo solo, porque el shell debe establecer el grupo de procesos en primer plano. El shell no puede hacerlo solo, porque el terminal tiene que procesar la pulsación de la tecla (el shell no está en primer plano, por lo que no puede recibir una pulsación de la tecla).

Tengo una configuración zsh donde puedo presionar Ctrl+ Zdos veces en rápida sucesión; la primera prensa suspende el proceso y la segunda prensa lo reanuda en segundo plano. No sé cómo portarlo a bash.

Si está ejecutando en un emulador de terminal que le permite inyectar pulsaciones de teclas, puede inyectar ^Zbg^M(usando la ^notación para los caracteres de control). Por ejemplo, con un emulador de terminal X11, ejecute xdotool --window 1234 Ctrl_L+Z b g Returndonde 1234 es la ID de ventana del emulador de terminal. Con Pantalla, ejecute screen -S foo -p 12 -X stuff $'\032bg\r'donde fooestá el nombre de la sesión de pantalla y 12la ID de la ventana.

Gilles 'SO- deja de ser malvado'
fuente
2

Si su escritura no es lo suficientemente rápida para el caso, ejecute kill -s SIGSTOP 1023 && kill -s SIGCONT 1023desde otro shell, suponiendo 1023 como PID objetivo.

DESCARGO DE RESPONSABILIDAD: Como Ruslan probablemente sabía, esa secuencia en realidad reinicia el trabajo tan rápido bashque no lo nota.

41754
fuente
¿Cómo colocaría el trabajo en segundo plano?
Ruslan
¿Qué tan rápido es rápido?
user877329