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

4

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

<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 shell script, fico preso em uma tela preta)

    
por AnkurVj 15.04.2012 / 20:37

3 respostas

8

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

% qemu-kvm --help | grep daemon
-daemonize      daemonize QEMU after initializing
    
por 16.04.2012 / 04:49
2

Você vê uma mensagem como

[1] suspended (tty output) myapplication

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

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

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

    
por 16.04.2012 / 02:50
1

Existe uma diferença entre executar um comando em segundo plano do terminal e de um script de shell.

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

Veja o padrão POSIX na Linguagem de comandos da 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 ${!}'
    
por 22.09.2014 / 16:48