Melhorias sugeridas no script de gravação de fluxo: tempo limite?

2

Estou tentando adaptar o script abaixo (tirado de link ) para fazer com que meu sistema grave um fluxo de vídeo sempre que um determinado arquivo for alterado no sistema:

#!/bin/bash

# Set initial time of file
LTIME='stat -c %Z /path/to/monitored/file'

while true    
do
   ATIME='stat -c %Z /path/to/monitored/file'

   if [[ "$ATIME" != "$LTIME" ]]
   then    
       echo "RUN COMMAND"
       LTIME=$ATIME
   fi
   sleep 5
done

Como é evidente, o script pesquisa o registro de data e hora do arquivo monitorado a cada 5 segundos para ver se ele foi alterado e, se houver, ecoa algo no terminal. Também ficará claro que o comando echo é apenas uma espécie de prova de conceito e que praticamente qualquer outro comando pode ocupar seu lugar no script.

Aqui está o que eu tenho até agora que quase funciona como desejado para meus propósitos ( recordingscript.sh usa mplayer -dumpstream -dumpfile mystream URL para gravar um fluxo por 70 minutos):

#!/bin/bash

# Set initial time of file
LTIME='stat -c %Z /path/to/monitored/file'

while true    
do
   ATIME='stat -c %Z /path/to/monitored/file'

   if [[ "$ATIME" != "$LTIME" ]]; then
      /path/to/my/recordingscript.sh
        break
      LTIME=$ATIME
   fi
   sleep 5
done

O problema que permanece é que eu gostaria que esse script fosse executado como um trabalho cron a cada dia da semana, digamos, em um período de cinco horas. Se nenhuma alteração for feita no arquivo monitorado dentro desse intervalo de tempo, eu simplesmente gostaria que o script fosse interrompido / encerrado até a próxima vez que o cron o iniciasse. Como posso modificar meu script adaptado para que ele seja executado por aproximadamente cinco horas e depois sair? Eu percebo que eu provavelmente poderia fazer isso invocando o script com timeout 300m , mas eu pensei que poderia haver outras soluções, possivelmente melhores, para fazer isso

    
por MJiller 26.07.2018 / 00:07

1 resposta

1

Eu sugeriria o seguinte script, no qual fiz algumas alterações:

  • usou nomes de variáveis minúsculas
  • atribuiu uma variável "desistir" com uma expressão soletrada de "5 horas em segundos"
  • parametrizou o arquivo a ser monitorado na variável filetomonitor
  • alterou o loop while true para um loop de 5 horas, com base no comportamento da variável SECONDS bash, que conta o número de segundos desde que o shell foi iniciado. Isso começa no zero quando o script de shell é exibido.
  • alterou os backticks para o novo $( ... ) form

O script atualizado:

#!/bin/bash
giveup=$((5 * 60 * 60))
filetomonitor='/tmp/file-to-monitor'

ltime=$(stat -c %Z "$filetomonitor")
while [[ "$SECONDS" -lt "$giveup" ]]
do
  atime=$(stat -c %Z "$filetomonitor")
  if [[ "$atime" -ne "$ltime" ]]
  then
        echo Take action
        break           ## if we're only supposed to act once
        ltime=$atime
  fi
  sleep 5
done

Eu deixei o break lá, mas comentei. Se você quiser que o script saia (antes das 5 horas) após executar a ação, descomente a linha break ; caso contrário, a versão atual do script será executada por 5 horas (possivelmente mais, se a ação de 70 minutos começar às 4:59), possivelmente chamando a ação várias vezes.

    
por 06.09.2018 / 23:09