¿Cómo se envían aplicaciones de línea de comandos directamente al fondo?

22

Ya sé que presionar ctrl+zdetiene la aplicación, luego puedo enviar la aplicación a segundo plano con el bgcomando, pero eso significa que hay un breve período de tiempo en que la aplicación se detiene.

¿Cómo envío la aplicación directamente al fondo sin detenerla?

trusktr
fuente
Estoy seguro de que no puedes, si ya está funcionando.
Kevin
1
Si su tarea requiere su entrada "antes de desaparecer" en el fondo, puede usar herramientas como zenity o yad (si le gustan las guis). Todavía pueden enviar y recibir resultados desde el fondo. Estoy seguro de que jugar con tuberías y dispositivos también te daría acceso a la consola desde el fondo, pero no estoy seguro de cómo hacerlo.
Joe
@ Joe Eso es genial, pero no es lo que quiero decir. Solo quiero enviar una aplicación directamente al fondo sin pausarla. es decir, sin presionar ctrl+zseguido de ejecutar el comando bg. ¿Hay una combinación de teclas para enviar la aplicación a un segundo plano?
trusktr

Respuestas:

17

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 tiene que 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).

Una aproximación cercana es enviar la aplicación al fondo realmente rápido. Después de todo, una aplicación comparte el tiempo de CPU con otros y una pausa de unas pocas centésimas de segundo no debería importar. (Lo hace para aplicaciones en tiempo real, así que asegúrese de iniciarlas en segundo plano). Utilizo un enlace de shell para Ctrl+ Zque envía el último trabajo en segundo plano al fondo. De esa manera, presionar Ctrl+ Z Ctrl+ Zenvía un trabajo a un segundo plano con un tiempo de suspensión mínimo.

Aquí está mi enlace zsh, que también "en segundo plano" un comando medio tipado cuando la línea de comando no está vacía .

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

En inglés, para los usuarios que no son zsh en la audiencia:

  • Defina una función de shell que haga lo siguiente:

  • Vincula esta función a Ctrl+ Z.

Si solo desea el comportamiento de fondo, independientemente de si la línea de comando está vacía:

function bg_ { builtin bg "$@"; }
zle -N bg_
bindkey '^Z' bg_

No sé si puedes hacer lo mismo en bash. Debería ser tan fácil como bind -x '"\C-z": bg', excepto que bash deja el carácter tty stop en su lugar, por lo que nunca obtiene Ctrl+ Zcomo entrada.

Gilles 'SO- deja de ser malvado'
fuente
Interesante, déjame ver si esto se puede hacer en Bash. Si es así, esta sería una solución. No estoy familiarizado con zsh. ¿Te importaría explicar qué hace tu guión?
trusktr
@trusktr Ver mi edición.
Gilles 'SO- deja de ser malvado'
¡Gracias! Estoy a punto de cambiar a zsh. He estado escuchando muchas cosas buenas al respecto.
trusktr
15

Puede realizar una tarea en segundo plano agregando un &después.

Por ejemplo tail -f /var/log/messages &, la tarea se ejecutará en segundo plano inmediatamente.

Como siempre, puede ver qué tareas realizó en segundo plano con el jobscomando.

Por supuesto, esto supone que aún no ha ejecutado el comando.

prateek61
fuente
Eso es útil, pero no es lo que quiero decir. Si tengo la aplicación en primer plano, luego quiero enviarla al fondo más tarde, puedo presionar y ctrl+zluego ejecutar bgen la línea de comando para que la aplicación se ejecute en segundo plano. Pero entre presionar ctrl+zy ejecutar bg, hay un marco de tiempo en el que la aplicación está completamente en pausa. No quiero eso ¿Cómo lo envío a segundo plano inmediatamente ?
trusktr
@trusktr como dijo Gilles. Debe informar tanto al shell como al terminal. Lo siento, no sé de una manera de hacer eso.
prateek61
No responde la pregunta.
Luciano Andress Martini
4

El trasfondo de un comando se realiza agregando un ampersand al comando.

sleep 300 &

Si ya se está ejecutando, su única opción es detenerlo y luego ponerlo en segundo plano.

bahamat
fuente
Entre presionar ctrl + z y ejecutar bg, hay un marco de tiempo en el que la aplicación está completamente en pausa, que es lo que no quiero. Entonces, ¿no hay forma de enviarlo al fondo de inmediato ?
trusktr
1
No Como dijo Giles, se necesita tanto el shell como el terminal. Necesitas informar a cada uno.
bahamat