Obtendo eventos do crontab que aconteceriam com uma data / hora de início

1
Vamos supor que temos um crontab agendando alguns comandos em um projeto RPi, e esses comandos alternam o status de um sinalizador. A caixa pode ficar sem energia e, em seguida, reinicializar. Quero ter o status de sinalizador no estado correto se a caixa estivesse funcionando continuamente.

Minha ideia:
Tendo uma tarefa na reinicialização que:

  1. recupera a última data de um estado conhecido (isso deve ser fácil, eu pode salvar uma entrada de log em um arquivo ea data desse arquivo é a "last well know state date")
  2. pede que o crontab tenha a lista de eventos que aconteceriam nesse lapso, e com estes calcule o novo status.
  3. feito, trabalhe como de costume:)

Deixe-me saber se existe uma maneira mais inteligente de fazê-lo e, em caso negativo, como posso alcançar o ponto 2?

    
por Felice Pollano 19.06.2015 / 09:14

3 respostas

1

cron não fornecerá uma lista de eventos. O que ele pode fazer é iniciar seu script regularmente. Faça com que o script faça o seguinte:

  1. leia um carimbo de data e hora de um arquivo de configuração em var X
  2. incremente X com um intervalo de evento pré determinado (por exemplo, 60 minutos)
  3. enquanto X < data-hora atual executa o resto do script e escreve X no arquivo de configuração e repete 2
  4. (você pode querer esperar um tempo mínimo no loop)

Dessa forma, o script, mesmo que a máquina seja desativada enquanto estiver em execução, alternará o sinalizador quantas vezes desejar. Como o script não faz nada se o arquivo de carimbo de data / hora não for mais antigo que o intervalo, você poderá chamá-lo do cron job com muito mais frequência do que teria que ser executado. Dessa forma, recuperar o atraso após uma reinicialização não precisa acontecer (em média) após metade do tempo de intervalo. (por exemplo, agende o script para ser executado a cada cinco minutos). Você terá que usar um bloqueio para evitar que um script seja executado duas vezes (enquanto um está tentando recuperar o atraso após um desligamento).

    
por 19.06.2015 / 09:42
0

Por que você não grava o status no armazenamento não volátil, ou seja, /var/tmp/status_task_x e lê o último status do conjunto do mesmo arquivo na próxima execução? Nesse caso, ele deve sobreviver a uma reinicialização.

Em um exemplo de crontab:

* * * * * status_task_x=$(<"/var/tmp/status_task_x") /path/to/run_task_x $status_task_x

Peça ao script de tarefa para gravar a saída em /var/tmp/status_task_x

    
por 19.06.2015 / 09:23
0

Aparentemente, não é uma tarefa pronta para uso. Eu encontrei uma biblioteca em python: link que permitem encontrar um "cronograma" para um único trabalho:

schedule = job.schedule(date_from=datetime.now())
...
datetime = schedule.get_next()

Isso é exatamente a necessidade. Looping de date_from da última data de reinicialização, enquanto datetime a menos que agora.

    
por 19.06.2015 / 11:02

Tags