Você tem */30
o especificador de minutos - isso significa cada minuto, mas com uma etapa de 30 (em outras palavras, a cada meia hora). Como cron
não diminui para resoluções de menos de um minuto, você precisará encontrar outra maneira.
Uma possibilidade, embora seja um pouco desagradável (a) , é ter dois trabalhos, um compensado por 30 segundos:
# Need these to run on 30-sec boundaries, keep commands in sync.
* * * * * /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )
Você verá que adicionei comentários e formatei para garantir que seja fácil mantê-los sincronizados.
Ambos os cron
trabalhos são executados a cada minuto, mas o último espera meio minuto antes de executar a "carne" do trabalho /path/to/executable
,.
Para outras cron
opções (sem base), consulte as outras respostas aqui, principalmente as que mencionam fcron
e systemd
. Provavelmente, é preferível presumir que seu sistema tenha a capacidade de usá-los (como instalar fcron
ou fazer uma distribuição comsystemd
).
Se você não quiser usar a solução kludgy, poderá usar uma solução baseada em loop com uma pequena modificação. Você ainda precisará manter o processo em execução de alguma forma, mas, assim que for classificado, o seguinte script deverá funcionar:
#!/bin/env bash
# Debug code to start on minute boundary and to
# gradually increase maximum payload duration to
# see what happens when the payload exceeds 30 seconds.
((maxtime = 20))
while [[ "$(date +%S)" != "00" ]]; do true; done
while true; do
# Start a background timer BEFORE the payload runs.
sleep 30 &
# Execute the payload, some random duration up to the limit.
# Extra blank line if excess payload.
((delay = RANDOM % maxtime + 1))
((maxtime += 1))
echo "$(date) Sleeping for ${delay} seconds (max ${maxtime})."
[[ ${delay} -gt 30 ]] && echo
sleep ${delay}
# Wait for timer to finish before next cycle.
wait
done
O truque é usar um sleep 30
mas para iniciá-lo em segundo plano antes que sua carga útil seja executada. Depois que a carga útil terminar, aguarde o segundo planosleep
a conclusão de .
Se a carga útil levar n
segundos (onde n <= 30
), a espera após a carga útil será de 30 - n
segundos. Se demorar mais de 30 segundos, o próximo ciclo será adiado até a carga útil terminar, mas não mais.
Você verá que eu tenho um código de depuração para iniciar um limite de um minuto para facilitar a saída inicialmente a seguir. Eu também aumento gradualmente o tempo máximo de carga útil, para que você eventualmente veja a carga útil exceder o tempo de ciclo de 30 segundos (uma linha em branco extra é emitida para que o efeito seja óbvio).
A seguir, é executada uma amostra (onde os ciclos normalmente começam 30 segundos após o ciclo anterior):
Tue May 26 20:56:00 AWST 2020 Sleeping for 9 seconds (max 21).
Tue May 26 20:56:30 AWST 2020 Sleeping for 19 seconds (max 22).
Tue May 26 20:57:00 AWST 2020 Sleeping for 9 seconds (max 23).
Tue May 26 20:57:30 AWST 2020 Sleeping for 7 seconds (max 24).
Tue May 26 20:58:00 AWST 2020 Sleeping for 2 seconds (max 25).
Tue May 26 20:58:30 AWST 2020 Sleeping for 8 seconds (max 26).
Tue May 26 20:59:00 AWST 2020 Sleeping for 20 seconds (max 27).
Tue May 26 20:59:30 AWST 2020 Sleeping for 25 seconds (max 28).
Tue May 26 21:00:00 AWST 2020 Sleeping for 5 seconds (max 29).
Tue May 26 21:00:30 AWST 2020 Sleeping for 6 seconds (max 30).
Tue May 26 21:01:00 AWST 2020 Sleeping for 27 seconds (max 31).
Tue May 26 21:01:30 AWST 2020 Sleeping for 25 seconds (max 32).
Tue May 26 21:02:00 AWST 2020 Sleeping for 15 seconds (max 33).
Tue May 26 21:02:30 AWST 2020 Sleeping for 10 seconds (max 34).
Tue May 26 21:03:00 AWST 2020 Sleeping for 5 seconds (max 35).
Tue May 26 21:03:30 AWST 2020 Sleeping for 35 seconds (max 36).
Tue May 26 21:04:05 AWST 2020 Sleeping for 2 seconds (max 37).
Tue May 26 21:04:35 AWST 2020 Sleeping for 20 seconds (max 38).
Tue May 26 21:05:05 AWST 2020 Sleeping for 22 seconds (max 39).
Tue May 26 21:05:35 AWST 2020 Sleeping for 18 seconds (max 40).
Tue May 26 21:06:05 AWST 2020 Sleeping for 33 seconds (max 41).
Tue May 26 21:06:38 AWST 2020 Sleeping for 31 seconds (max 42).
Tue May 26 21:07:09 AWST 2020 Sleeping for 6 seconds (max 43).
Se você deseja evitar a solução kludgy, isso provavelmente é melhor. Você ainda precisará de um cron
trabalho (ou equivalente) para detectar periodicamente se esse script está em execução e, se não, iniciá-lo. Mas o próprio script lida com o tempo.
(a) Alguns de meus colegas de trabalho diriam que kludges são minha especialidade :-)