Inicie o aplicativo não-GUI após a conexão de rede estar ativa e em execução

4

Estou usando o Raspbian, que é baseado no Debian. Meu Raspberry inicializa automaticamente na área de trabalho. Eu tenho um pequeno programa escrito em C e compilado com g + + como executável. O programa precisa de uma conexão de rede em execução e envia alguns dados para o terminal. Nada extravagante.

Para usá-lo, eu tenho que abrir uma janela do LXterminal e executar o programa manualmente com direitos de sudo

sudo ./Desktop/rpiMainProgram

Minha pergunta é: Como eu inicio automaticamente um programa baseado em terminal depois que uma conexão de rede é estabelecida?

Eu uso wvdial para conectar um dongle 3G automaticamente via /etc/network/interface . A conexão funciona. Posso pingar e navegar

auto ppp0
iface ppp0 inet wvdial

Eu segui este tutorial para configurar o wvdial se isso for importante

Eu vi um método que usa o método post-up em /etc/network/interfaces para chamar uma festança (?) roteiro. Mas eu não consegui esse método para executar um aplicativo não-GUI

Minha última tentativa antes de desistir foi

auto ppp0
iface ppp0 inet wvdial
post-up LXterminal "sudo ./Desktop/rpiMainProgram"
    
por nixda 21.06.2015 / 22:00

3 respostas

2

Você poderia colocar algo assim em seu arquivo /etc/rc.local (não testado):

{ while ! ping -c 1 -W 1 8.8.8.8; do  sleep 1; done; /home/youruser/Desktop/rpiMainProgram > /home/youruser/Desktop/rpiMainProgram.log 2>&1; }&

ping -c 1 -W 1 8.8.8.8 : envia um pacote de ping e espera 1 segundo pelo seu retorno

O loop while continua enquanto o comando ping sair com um código de status > 0, ou seja, desde que falhe.

Quando você tiver uma conexão de rede e puder efetuar ping de 8.8.8.8 com êxito, o loop parará e executará seu programa (verifique se chamá-lo assim faz diferença, por exemplo, com pwd ).

Com o {} , transformamo-lo em um tipo de comando singular, para que possamos colocar tudo em segundo plano usando & . Caso contrário, bloquearia o restante de /etc/rc.local até você ter uma rede.

Pode haver soluções mais elegantes, mas eu tenho algo parecido com isso no meu Pi.

    
por 21.06.2015 / 22:43
1

Inicie seu programa em um multiplexador de terminal, como tela ou tmux . Use-o para criar um terminal desanexado onde você executa seu programa e conecte-se a esse terminal quando quiser interagir com ele. Por exemplo, com a tela, execute isso durante a inicialização:

screen -S rpiMainProgram -d -m /home/nixda/Desktop/rpiMainProgram

e use isso para anexar à instância da tela em que o programa é executado:

screen -S rpiMainProgram -r -d

Para desanexar da instância da tela, pressione Ctrl + A e então d .

No Debian, para executar um programa após uma interface de rede ser ativada, adicione um script em /etc/network/if-up.d . Você precisará verificar qual interface está sendo ativada (em geral, você não deseja iniciar o programa quando a interface de loopback é iniciada). Crie /etc/network/if-up.d/local_rpiMainProgram contendo algo como

#!/bin/sh
case "$IFACE" in
  ppp0) screen -S rpiMainProgram -d -m /home/nixda/Desktop/rpiMainProgram
esac

ou

#!/bin/sh
if ping -q -W1 -c1 8.8.8.8; then
  screen -S rpiMainProgram -d -m /home/nixda/Desktop/rpiMainProgram
fi
    
por 23.06.2015 / 02:01
0

Usar o rungetty para executá-lo em um terminal virtual não utilizado funcionaria muito bem. controle alt f n para ver a saída.

    
por 22.06.2015 / 01:04