QEMU não inicia quando executado em segundo plano dentro do shell script

QEMU não inicia quando executado em segundo plano dentro do shell script

Eu tenho um aplicativo que funciona bem, com e sem '&' quando executado diretamente do terminal. No entanto, se eu tentar executá-lo a partir de um script de shell, ele funcionará apenas se o '&' final for ignorado. Portanto, não consigo iniciar esse processo em segundo plano a partir do shell script.

<Path to My application> <options> &

A janela do aplicativo é aberta, mas não progride depois disso.

(O aplicativo é uma versão modificada (por mim) do qemu 0.13.0. Quando executo uma imagem de disco em segundo plano em um script de shell, fico preso em uma tela preta)

Responder1

Não há necessidade de colocar o aplicativo em segundo plano com o E comercial quando ele tiver uma opção integrada para fazer isso. Esse é o caso do qemu (a menos que você o tenha removido):

% qemu-kvm --help | grep daemon
-daemonize      daemonize QEMU after initializing

Responder2

Você vê uma mensagem como

[1] suspended (tty output) myapplication

no terminal? Esta mensagem significa que seu programa está tentando ler no terminal (provavelmente porque está lendo sua entrada padrão). Como apenas um programa em primeiro plano pode ler no terminal, o programa é suspenso.

Se você vir esta mensagem, descubra por que seu programa está lendo. Em desespero, tente redirecionar sua entrada padrão ( myapplication </dev/null).

Se você não vir essa mensagem, é algum outro bug no seu programa. Veja o que seu programa está fazendo em um depurador ou com strace.

Responder3

Há uma diferença entre executar um comando em segundo plano no terminal e em um script de shell.

Em um shell não interativo (com controle de trabalho desabilitado), o stdin de um comando em segundo plano é redirecionado implicitamente de /dev/null, o que pode fazer com que seu comando não seja executado.

Veja o padrão POSIX noLinguagem de comando Shell: listas assíncronas.

# 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 ${!}'

informação relacionada