Reinicia um processo quando eu obtenho stderr de outro processo

4

Eu tenho este processo em constante execução que envia alguns dados coletados localmente para um terminal. Agora há algum problema no módulo wi-fi raspberryPi e cai a conexão com freqüência. Depois de reiniciar a rede, ele começa a funcionar novamente.

Então é isso que eu tenho agora, baseado no fato de que toda vez que a Internet se desconecta, o proc1 começa a jogar stderr:

while true; do
   ./proc1 2>&1 >/dev/null | sudo /etc/init.d/networking restart
done &

Mas esse código reinicia a rede várias vezes, sem ter certeza do motivo.

O que eu realmente quero é algo assim:

while true: 
   if proc1 has stderr: 
      sudo /etc/init.d/networking restart; 
      sleep 10;

Então, minha pergunta é:

  1. Como posso converter esse pseudocódigo para bash?
  2. Esse é um truque para contornar o problema real de quedas de redes, como depurar o que está errado?
por zengr 10.04.2014 / 03:48

3 respostas

2

UPDATE

Isso é muito mais simples:

( 
{ ${PROC1_CMD} >&3 } 2>&1 | 
    while : ; do 
        grep -q "YOUR ERROR MESSAGE" && ${YOUR_ACTION} 
    done
) 3>&2

Basicamente, estamos apenas trocando stdin e stderr para $PROC1_CMD , para que possamos grep de sua saída sobre o |pipe. Dessa forma, qualquer que seja seu processo, ele pode dizer normalmente, mas assim que escreve para stderr a mensagem que você não deseja pode levar $YOUR_ACTION.

    
por 10.04.2014 / 08:44
1

Pesquisa ocupada é ruim, especialmente para sua situação em que você tem que reiniciar algo imediatamente e, portanto, não pode usar sleep () dentro de loop.

A melhor maneira é confiar em construções fornecidas pelo sistema operacional. Como é um script de shell, use inotify-tools: link

Exemplos podem ser encontrados em: link

    
por 10.04.2014 / 08:22
1

Monitorando o WiFi

Estas não são necessariamente soluções Bash, mas eu usei muitas dessas ferramentas para monitorar um processo e reiniciá-lo. Eu acho que você está tentando monitorar a coisa errada em sua abordagem. Em vez de monitorar a saída do seu script, você deve, de fato, estar monitorando seu serviço de rede.

Você pode ler mais sobre a configuração e o uso deles nas perguntas e respostas sobre o assunto e as perguntas: Como definir o monitoramento adequado dos meus serviços de forma automatizada? De modo que, se um deles travar automaticamente, a reinicialização será iniciada? .

Eu tenho uma preferência por Deus, que é extremamente fácil de configurar e usar. Isso requer uma instalação do Ruby, mas um dos outros pode atender melhor às suas necessidades.

Outras abordagens

Dado que este é um problema do Rasp Pi, há realmente um tópico no site relacionado a esse problema. Há muitas sugestões que você pode usar desse segmento também. O tópico é intitulado: Wifi Reconnect on drop .

    
por 10.04.2014 / 17:30

Tags