linux bash backgrounding e redirecionamento de E / S

0

Estou tendo problemas de redirecionamento de arquivos e de plano de fundo.

Eu preciso anexar a uma caixa de sensor remoto e gravar o fluxo de dados ascii dessa caixa nos arquivos do disco. Eu gostaria de dividir esse fluxo de dados em segmentos de aproximadamente 10 minutos cada com um carimbo de data e hora com sufixo no nome do arquivo.

Para esse fim, eu tenho um script que gera um nome de arquivo, se conecta à caixa remota usando nc > filename . (note que defini o tempo no código anexado para 1 minuto, em vez de 10 minutos).

Este script registra os dados no nome do arquivo gerado conforme o esperado:

#!/bin/bash
DEST=/home/sensors/gps1
[[ -d $DEST ]] || mkdir -p $DEST

while true

do

  DESTFILE=$DEST/"gps1-freq-ref-capture-"'date +"%Y-%m-%d-%H%M"'

  nc fepts03 20014 > $DESTFILE
  NCPID=$!

  sleep 60 ; kill $NCPID

done

Mas a execução nunca passa de nc .

Backgrounding nc , por outro lado, fornece os nomes de arquivos corretos, mas são arquivos vazios.

 #!/bin/bash
DEST=/home/sensors/gps1
[[ -d $DEST ]] || mkdir -p $DEST

while true

do

  DESTFILE=$DEST/"gps1-freq-ref-capture-"'date +"%Y-%m-%d-%H%M"'

  nc fepts03 20014 > $DESTFILE &     # <-- note backgrounding ampersand
  NCPID=$!

  sleep 60 ; kill $NCPID

done

Mas os arquivos estão vazios:

$ ls -la
-rw-rw-rw-+  1 sensors sensors     0 Jul 23 15:00 gps1-freq-ref-capture-2012-07-23-1500
-rw-rw-rw-+  1 sensors sensors     0 Jul 23 15:01 gps1-freq-ref-capture-2012-07-23-1501
-rw-rw-rw-+  1 sensors sensors     0 Jul 23 15:02 gps1-freq-ref-capture-2012-07-23-1502

Eu pensei que era uma coisa de console stdin / stdout, então eu tentei rodar em uma sessão dtach com os mesmos resultados: bons nomes de arquivos, sem dados.

    
por user52874 24.07.2012 / 01:41

1 resposta

0

Os arquivos de saída estarão vazios se não houver nada para se conectar na outra extremidade. Verifique com netstat -ln | grep portnumber no servidor. Se a outra extremidade é outra instância do netcat, você precisa esperar que ele execute depois o cliente sai e aguarda o início do novo processo.

$ cat connect-and-wait.sh
#!/bin/sh

dir=/home/jaroslav/tmp/so/nc-for-5-sec

while true; do
    now='date +%Y-%m-%d.%H:%M:%S'
    fil=gps1-freq-ref-capture-$now
    out=$dir/$fil

    nc eee.lan 5555 > $out &
    pid=$!

    sleep 5 && kill $pid && echo wrote $out
    #sleep 1;                                  <-- try this 
done

Essa abordagem é falha porque você está prestes a perder dados enquanto se reconecta. Se a outra extremidade for realmente outra instância de nc , basta reiniciar o servidor em um loop de shell será problemático (ele não se liga algumas vezes na minha experiência). Portanto, tente manter uma conexão e faça algo com a saída:

$ cat connect-and-rotate-log.sh
#!/bin/sh

dir=/home/jaroslav/tmp/so/nc-for-5-sec

now=out
fil=gps1-freq-ref-capture-$now
out_=$dir/$fil

nc eee.lan 5555 > $out_ &

while [ -f $out_ ]; do
    now='date +%Y-%m-%d.%H:%M:%S'
    fil=gps1-freq-ref-capture-$now
    out=$dir/$fil

    sleep 5
    echo wrote $out

    cp $out_ $out
    echo > $out_
done

Não é perfeito, mas é melhor. Além disso, você pode querer verificar a conexão com nmap , por exemplo:

nmap eee.lan -p 5555 | grep -q  '^5555.*open' && echo open
    
por 18.07.2013 / 22:37