49 18 * * * mpv ~/Musik/Donau.mp3
Este comando reproduziria o Donau.mp3
arquivo exatamente às 18h49. Como eu poderia, por exemplo, especificar 6:49:50pm?
49 18 * * * mpv ~/Musik/Donau.mp3
Este comando reproduziria o Donau.mp3
arquivo exatamente às 18h49. Como eu poderia, por exemplo, especificar 6:49:50pm?
Usando
systemd
o temporizador: https://wiki.archlinux.org/title/Systemd/TimersVocê também pode especificar segundos:
Ou assim, 'hacking'
crontab
:Não espere que esta última solução seja precisa devido à forma como
cron
funciona.Não exatamente 18h49, exatamente 18h49. Essa é uma distinção importante que, na verdade, explica em parte por que a maioria das implementações do cron não pode fazer o que você deseja.
Em um nível alto, o que o crond realmente faz é dormir por aproximadamente 60 segundos, depois verificar quais tarefas precisam ser executadas e dispará-las, depois dormir novamente por aproximadamente 60 segundos menos o tempo que levou para verificar e iniciar as tarefas neste ciclo.
No entanto, nenhum dos mecanismos usados para suspender um processo por algum tempo em sistemas do tipo UNIX permite um tempo de ativação exato . Eles apenas permitem que você especifique um limite inferior no horário de ativação. Por exemplo, no código C,
sleep(10);
irá dormir por pelo menos 10 segundos, mas pode dormir por mais tempo do que isso (na verdade, quase sempre vai dormir pelo menos um quanta de agendamento a mais do que isso). Normalmente, a discrepância é inferior a 200 ms, mas é totalmente possível que seja significativamente mais longa se o sistema estiver muito carregado ou se o processo que está sendo ativado tiver uma prioridade excepcionalmente baixa.Para o caso usual de crond de dormir por 60 segundos, o jitter de alguns segundos é geralmente insignificante, porque ele pode apenas ajustar quanto tempo dorme no próximo ciclo para compensar. Se, no entanto, ele estivesse tentando executar as coisas a cada segundo, o jitter de mais de meio segundo seria suficiente para causar problemas de confiabilidade e possivelmente perder eventos.
Isso levanta a questão de por que o systemd permite que você especifique carimbos de data/hora até o segundo para unidades de cronômetro. A realidade é que ele também não agenda com essa precisão . O Systemd oferece resolução por segundo porque opera de maneira fundamentalmente diferente do crond, em vez de verificar todos os ciclos de tarefas que precisam ser executadas, o systemd define os cronômetros para serem ativados quando uma tarefa precisa ser executada. Em um sistema idealizado com jitter de tempo mínimo, isso permite que ele realmente acione as coisas com esse nível de precisão. Na prática, porém, não é incomum em um sistema ocupado que as unidades de timer programadas com essa precisão estejam um ou dois segundos atrasadas.
Se você realmente precisa desse nível de precisão, a resposta correta é usar um sistema operacional em tempo real para o que quer que esteja fazendo, não um sistema operacional de compartilhamento de tempo.
Você pode chegar perto disso em um sistema Linux executando o crond com uma prioridade de agendamento em tempo real, mas fazer isso com segurança requer uma quantidade significativa de esforço para garantir que as tarefas não herdem essa prioridade (o que representaria um risco não trivial de causar problemas para qualquer outra coisa em execução no sistema), mas isso ainda não permitirá que você escolha os horários exatos até o segundo para executar os trabalhos.