Por lo que puedo deducir.
Los trabajos en segundo plano no pueden leer el terminal del usuario. Cuando uno intente hacerlo, se suspenderá hasta que el usuario lo traiga al primer plano y proporcione alguna entrada. "leer desde la terminal del usuario" puede significar directamente intentar leer desde la terminal o cambiar la configuración de la terminal.
Normalmente, eso es lo que desea, pero a veces los programas leen desde la terminal y/o cambian la configuración de la terminal no porque necesiten la entrada del usuario para continuar, sino porque quieren verificar si el usuario está tratando de proporcionar información.
http://curiousthing.org/sigttin-sigttou-deep-dive-linux tiene detalles técnicos sangrientos.
En Linux y otros sistemas Unix, un trabajo que se ejecuta en segundo plano, pero aún tiene su stdin
(o std::cin
) asociado con su terminal de control (también conocida como la ventana en la que se ejecutó) recibirá un SIGTTIN
señal, que de forma predeterminada hace que el programa se detenga por completo, a la espera de que el usuario lo lleve al primer plano (fg %job
o similar) para permitir que la entrada se dé realmente al programa. Para evitar que el programa se pause de esta manera, puede:
- Asegúrese de que los programas
stdin
el canal ya no está asociado con el terminal, ya sea redirigiéndolo a un archivo con contenido apropiado para que el programa lo ingrese, o a/dev/null
si realmente no necesita entrada, p.myprogram < /dev/null &
. - Salga de la terminal después de iniciar el programa, lo que provocará la asociación con el
stdin
del programa para irme Pero esto causará unSIGHUP
para ser entregado al programa (lo que significa que el canal de entrada/salida experimentó un "colgado"); esto normalmente hace que un programa finalice, pero esto se puede evitar usandonohup
- p.ej.nohup myprogram &
.
Si está interesado en capturar la salida del programa, esta es probablemente la mejor opción, ya que evita las dos señales anteriores (así como un par de otras) y guarda la salida para que la vea y determine si hay algún problema con la ejecución de los programas:
nohup myprogram < /dev/null > ${HOME}/myprogram.log 2>&1 &
Sí, realmente está detenido y ya no funciona en segundo plano. Para devolverlo a la vida, escriba fg
número_trabajo