Tenho uma tarefa que precisa ser executada no cronograma do meu projeto (3 semanas).
Sou capaz de configurar o cron para fazer isso toda semana ou (por exemplo) na 3ª semana de cada mês - mas não consigo encontrar uma maneira de fazer isso a cada três semanas.
Eu poderia hackear o script para criar arquivos temporários (ou similares) para que funcionasse na terceira vez em que foi executado - mas essa solução cheira.
Isso pode ser feito de maneira limpa?
Respostas:
O arquivo crontab permite apenas especificar:
Portanto, não é possível especificar quais semanas devem ser aplicadas.
Escrever um script de wrapper pode ser a melhor opção.
Você pode obter o número da semana em um shell-script usando
ou
dependendo se você deseja que suas semanas comecem no domingo ou na segunda-feira.
Então você poderia usar
E $ check seria 0 na 1ª, 4ª, 7ª, ... semanas do ano.
fonte
Graças às respostas anteriores, foram apontadas as opções de época para data -e ou formatação como% s
Embora um pouco doloroso
((date +%s) / 86400)
dê dias a partir da época.Confiando no trabalho semanal que está sendo executado ao mesmo tempo, é fácil verificar isso em um dia específico de um período de três semanas (
$epoch_day%21 == 13
por exemplo)No meu caso, isso é bom, pois é uma tarefa de uma só vez. Se faltar no dia em particular, não haverá necessidade de correr na próxima oportunidade.
fonte
Se você pode salvar um arquivo de carimbo de data / hora entre as execuções, pode verificar a data dele em vez de confiar apenas na data atual.
Se o seu comando find suporta valores fracionários para
-mtime
(ou possui-mmin
) (o GNU find possui ambos , o POSIX parece não exigir nenhum dos dois ), você pode 'estrangular' os trabalhos do cron com find e touch .Ou, se você possui um comando stat que suporta mostrar datas de arquivo como "segundos desde a época" (por exemplo, stat do Gnu coreutils , também outras implementações), você pode fazer sua própria comparação usando date , stat e os operadores de comparação do shell (junto com toque para atualizar um arquivo de carimbo de data / hora). Você também pode usar ls em vez de stat se ele puder fazer a formatação (por exemplo, ls do GNU fileutils ).
Abaixo está um programa Perl (eu o chamei
n-hours-ago
) que atualiza um arquivo de carimbo de data / hora e sai com êxito se o carimbo de data / hora original tiver idade suficiente. Seu texto de uso mostra como usá-lo em uma entrada crontab para acelerar um trabalho cron. Também descreve ajustes para “horário de verão” e como lidar com carimbos de data / hora 'atrasados' de execuções anteriores.fonte