
Tengo una aplicación que funciona bien, con y sin '&' cuando se ejecuta directamente desde la terminal. Sin embargo, si intento ejecutarlo desde un script de shell, solo funciona si se omite el '&' final. Por lo tanto, no puedo iniciar este proceso en segundo plano desde el script de shell.
<Path to My application> <options> &
La ventana de la aplicación se abre pero no avanza después de eso.
(La aplicación es una versión modificada (por mí) de qemu 0.13.0. Cuando ejecuto una imagen de disco en segundo plano en un script de shell, me quedo atascado con una pantalla negra)
Respuesta1
No es necesario poner en segundo plano la aplicación con el signo comercial cuando tiene una opción incorporada para hacerlo. Tal es el caso de qemu (a menos que lo hayas eliminado):
% qemu-kvm --help | grep daemon
-daemonize daemonize QEMU after initializing
Respuesta2
¿Ves un mensaje como
[1] suspended (tty output) myapplication
en la terminal? Este mensaje significa que su programa está intentando leer desde la terminal (probablemente porque está leyendo desde su entrada estándar). Dado que sólo un programa en primer plano puede leer desde la terminal, el programa se suspende.
Si ve este mensaje, averigüe por qué su programa está leyendo. En su desesperación, intente redirigir su entrada estándar ( myapplication </dev/null
).
Si no ve ese mensaje, es algún otro error en su programa. Mire lo que está haciendo su programa en un depurador o con strace
.
Respuesta3
Existe una diferencia entre ejecutar un comando en segundo plano desde la terminal y desde un script de shell.
En un shell no interactivo (con el control de trabajo deshabilitado), la entrada estándar de un comando en segundo plano se redirige implícitamente desde /dev/null
, lo que puede provocar que su comando no se ejecute en absoluto.
Consulte el estándar POSIX en laLenguaje de comandos de Shell: listas asincrónicas.
# compare where fd 0 is pointing to
sh -c 'sleep 10 & lsof -p ${!}'
sh -c 'sleep 10 0<&0 & lsof -p ${!}'
sh -c 'set -m; sleep 10 & lsof -p ${!}'
sh -ic 'sleep 10 & lsof -p ${!}'