Comportamento estranho com o comando bg

1

Como enviar processo (aplicativo) para o plano de fundo se ele sempre espera entrada no terminal e enviar dados recebidos do uart para stdout o tempo todo?

Não consigo enviar meu aplicativo para o plano de fundo com CTRL + Z & bg% number / bg %%.

Alguma ideia, o que está errado?

Meu dispositivo (programa) espera alguns comandos de entrada do terminal para configuração, antes de ser enviado para o segundo plano. E estou recebendo um erro ao tentar enviá-lo para o plano de fundo.

# [CTRL-Z]
[1]+  Stopped                 sudo ./my_app

# bg %1

e me mostra algo assim:

[1]+  Stopped                 sudo ./my_app
    
por Junior 17.09.2015 / 14:05

3 respostas

2

Quando um programa executado em segundo plano tenta ler a partir do terminal, ele é parado por um sinal SIGTTIN . A entrada está indo atualmente para o processo de primeiro plano¹; seria perturbador se a entrada fosse aleatoriamente para o programa de primeiro plano ou o programa de segundo plano. Então, o programa em segundo plano é suspenso até que seja colocado em primeiro plano.

Se você precisar apenas passar dados para o seu programa no início, envie os dados para ele.

echo "config=foo" | ./my_app &

Se você precisar interagir com o programa de vez em quando, mas ele pode continuar sendo executado sem supervisão na maior parte do tempo, execute-o em um multiplexador de terminal como Tela ou Tmux . Por exemplo, com tela:

screen -S my_app ./my_app

Digite a entrada necessária e pressione Ctrl + A para desanexar a sessão de tela, ou seja, deixe-a rodar em segundo plano e volte ao terminal original. Quando quiser interagir novamente com o programa, reconecte-se à sessão de tela:

screen -S my_app -rd

Se você precisar realizar algumas interações complexas automaticamente, escreva um script espere (ou um script em outro idioma com um biblioteca semelhante).

¹ Grupo de processos, mas não vou entrar nessa sutileza aqui.

    
por 18.09.2015 / 04:09
1

Se o seu comando continuar a ler a partir do tty, então você precisa chamar

fg

depois de receber uma mensagem "interrompida" para digitar a entrada esperada.

    
por 17.09.2015 / 15:35
0

Você não deveria passar os argumentos para stdin, para continuar a trabalhar? Se você apenas CTRL-Z, ele irá aguardar a entrada em segundo plano.

por exemplo,

$ cat test.sh
#!/bin/bash

read var
echo $var

$ cat <<EOF > input
d
EOF

$ ./test.sh < input
d

$ ./test.sh <input > stdout 2> stderr &
[2] 23180
[2]-  Done                    ./test.sh < input > stdout 2> stderr

$ cat stdout
d

Ao tentar iniciá-lo sem passar a entrada:

$ ./test.sh > stdout 2> stderr &
[2] 13012

[2]+  Stopped                 ./test.sh > stdout 2> stderr
    
por 17.09.2015 / 14:21