Por que o cron oferece apenas granularidade minuciosa?

5

Parece que existem casos de uso para coisas que você deseja executar uma vez a cada 5 segundos, duas vezes por minuto, etc., mas isso é impossível com o cron. Por que a granularidade do cron de segundo nível não foi incorporada aos sistemas operacionais modernos? (Ou tem e eu não sei ..?)

Kevin Burke
fonte
O cron é apenas um programa ... não há nada que o impeça de escrever algo semelhante que será executado a cada segundo. Mas, como MichaelT menciona ... a necessidade disso pode ser uma indicação de que, seja o que for que você esteja fazendo, talvez exija uma abordagem diferente, como um daemon dedicado.
precisa

Respostas:

13

Em suma, compatibilidade.

O formato que o crontab usa é descrito em detalhes minuciosos como parte da especificação POSIX . As distros do Linux geralmente não são 100% totalmente compatíveis com as especificações POSIX, mas geralmente são muito próximas, pois a maioria das coisas nas especificações POSIX são as partes de uma máquina semelhante ao Unix que os desenvolvedores consideram garantida como existente. No que diz respeito a Cron, o Linux Standard Base especifica diretamente diretamente que ele deve se comportar de acordo com o POSIX .

Certamente, distros individuais podem optar por modificar o Cron que usam, mas Adicionar granularidade de segundo nível exigiria outro campo, tornando o novo crontab efetivamente completamente incompatível com praticamente tudo o que usa o Cron.

Porém, salientar que é para compatibilidade realmente não nos dá uma ideia do motivo pelo qual é granular apenas no nível minucioso. Então, por que Cron sempre usou granularidade em nível de minuto?

Bem, eu não estava exatamente lá (nem sequer nasci na época), mas suspeito que seja devido à maneira como o Cron foi implementado pela primeira vez .

O cron na Versão 7 Unix, escrito por Brian Kernighan, era um serviço do sistema (mais tarde chamado daemons) invocado no / etc / inittab quando o sistema operacional entrou no modo multiusuário. Seu algoritmo era direto:

Leia / usr / etc / crontab

2.Determine se algum comando deve ser executado na data e hora atuais e, em caso afirmativo, execute-o como superusuário, raiz.

3.Dormir por um minuto

4.Repita o passo 1.

Uma implementação de Cron baseada em um ciclo de suspensão quase certamente quebraria miseravelmente com granularidade mais fina do que um minuto; como é, o Cron teve que ser reescrito para usar métodos mais eficientes para poder lidar com cargas da ordem de 100 usuários. A granularidade de um segundo seria ainda pior do que a de apenas dois usuários.

Portanto, como o programa inicialmente não conseguia lidar com isso, e porque o formato continuava e porque a alteração seria uma quebra de compatibilidade bastante grande, é muito provável que o cron nunca suporte granularidade de sub-minuto. Especialmente porque, como MichaelT apontou nos comentários, o uso de comandos de suspensão pode criar facilmente o comportamento desejado , sem a necessidade de alterações no próprio Cron.

Billy Mailman
fonte
Bem, você provavelmente poderia aumentar o campo de minutos usando, por exemplo, :sspor segundos, mas eu não gostaria de testar a transparência dessa alteração, e isso ainda não resolve nenhum dos outros problemas mencionados.
um CVn 17/07/2013