É difícil responder com precisão, pois há versões diferentes do cron com uma precisão potencialmente variável.
O NTP será definitivamente uma obrigação para uma solução como essa, e usará o ntpd ao invés do ntpdate, já que o ntpd ajustará constantemente o "comprimento de um segundo" ao comprimento correto de um segundo ao contrário do ntpdate que apenas ajusta o tempo e permite que ele se desloque novamente. Uma vez que o sistema inicializa, ele não usa mais o clock RTC suportado por bateria, mas usa interrupções geradas pela CPU, que são muito mais precisas, mas podem precisar ser ajustadas ligeiramente.
ligado ao cron:
Da página man do cron:
cron then wakes up every minute, examining all stored crontabs, checking each command to see if it should be run in the current minute. When executing commands, any output is mailed to the owner of the crontab (or to the user named in the MAILTO environment variable in the crontab, if such exists). The children copies of cron run‐ ning these processes have their name coerced to uppercase, as will be seen in the syslog and ps output.
A menos que o cron acorde a cada minuto no minuto , você não tem garantia de precisão, mas eu recomendo que você não considere isso como certo e teste-o. Sincronize os servidores usando o NTP, programe uma tarefa cron para tocar em arquivos durante um período de tempo e os registre.
Depois de tocar em arquivos suficientes, você deve ter uma idéia do tipo de precisão que seu cron tem.
Se o seu aplicativo tiver que ser sincronizado dentro do segundo, ou se o seu cron estiver muito impreciso, será melhor iniciar os scripts alguns segundos antes e, usando o relógio sincronizado NTP, faça com que os scripts esperem o momento certo. hora de prosseguir com o seu pedido.
Editar: um script rápido para dormir até o minuto especificado:
#!/bin/bash
minute_to_start=$1
minute_now='date +%M'
minutes_to_wait='echo $minute_to_start - $minute_now -1 | bc -l'
now='date +%S.%N'
to_sleep='echo 60 - $now + \( $minutes_to_wait \* 60 \) | bc -l'
sleep $to_sleep
$2
Você pode executá-lo no cron como:
29 7 * * * /path/to/above/script.sh 30 'the real script'
E o trabalho começará às 07:30:00
No meu teste, ele se moveu dentro de 10-20 milissegundos, e não funciona se você quiser começar em X: 00: 00.00 (na hora), então não é algo que eu realmente use na produção.