Tempo restante para a próxima execução

6

Preciso calcular o tempo restante para a próxima execução de um trabalho específico no Cron Schedule, tenho um Cron com trabalhos com frequências por hora, três vezes por dia, etc., sem trabalhos em dias / datas específicos. apenas HH: MM: SS está em causa, também não tenho o direito de verificar /var/spool/cron/ no meu RHEL. Se algum trabalho começar em 9:30 ,

30 9 * * * /some/job.sh
-bash-3.2$ date +"%H:%M"
13:52

Eu precisaria de uma saída como, 19 Hours and 38 Minutes Como eu estaria sabendo o tempo total até a próxima execução ocorrer a partir da hora atual do sistema? O cálculo de segundos está relacionado apenas ao tempo de trabalho.

    
por Keyshov Borate 27.01.2015 / 15:07

2 respostas

8

cron não sabe quando um trabalho será acionado. Tudo o que faz é a cada minuto, passar por cima de todas as entradas crontab e disparar aquelas que correspondem a "$(date '+%M %H %d %m %w')" .

O que você pode fazer é gerar todos esses timestamps para cada minuto a partir de agora até 49 horas a partir de agora (contabilizar a alteração do horário de verão), fazer a correspondência manualmente (a parte complicada) e reportar o primeiro correspondente.

Ou você pode usar o cronificador python module:

python -c '
from croniter import croniter
from datetime import datetime
iter = croniter("3 9 * * *", datetime.now())
print iter.get_next(datetime)'

Para o atraso:

$ faketime 13:52:00 python -c '
from croniter import croniter
from datetime import datetime
d = datetime.now()
iter = croniter("30 9 * * *", d)
print iter.get_next(datetime) - d'
19:37:59.413956

Cuidado com os possíveis bugs relacionados às alterações do horário de verão:

$ faketime '2015-03-28 01:01:00' python -c '
from croniter import croniter
from datetime import datetime
iter = croniter("1 1 * * *", datetime.now())
print iter.get_next(datetime)'
2015-03-29 02:01:00

$ FAKETIME_FMT=%s faketime -f 1445734799 date
Sun 25 Oct 01:59:59 BST 2015
$ FAKETIME_FMT=%s faketime -f 1445734799  python -c '
from croniter import croniter
from datetime import datetime
iter = croniter("1 1 * * *", datetime.now())
print iter.get_next(datetime)'
2015-10-25 01:01:00

$ FAKETIME_FMT=%s faketime -f 1445734799 python -c '
from croniter import croniter
from datetime import datetime
d = datetime.now()
iter = croniter("1 1 * * *", d)
print iter.get_next(datetime) - d'
-1 day, 23:01:01

O cron cuida disso evitando executar o trabalho duas vezes se o tempo foi para trás ou executar tarefas ignoradas após o turno se o tempo tiver passado.

    
por 27.01.2015 / 16:08
1

Ocorre que o formato %T do printf embutido do shell ksh93 suporta as especificações do crontab como entrada.

$ ksh93 -c 'printf "%(%F %T)T\n" now "30 9 * * *"'
2017-11-07 17:06:41
2017-11-08 09:30:00

Então você pode pegar o delta em segundos com:

#! /bin/ksh93
crontab_line='30 9 * * *'
delta=$(($(printf '(%(%s)T - %(%s)T) / 60' "$crontab_line" now)))
echo "Next run in $((delta/60)) hours and $((delta%60)) minutes."
    
por 07.11.2017 / 18:13