Como programar algo para rodar uma vez usando o anacron?

3

Freqüentemente, dentro dos meus scripts, eu agendo tarefas auxiliares para mais tarde no formulário:

at now + 8 hours <<< "rm -f workfile.$$ >> $worklog 2>&1 "

ou

at 11pm + $(date +%M) minutes <<< "./postMarketJob.sh $orderID &> $orderID.log"

O problema é que às vezes os laptops ou PCs que uso como servidores estão desligados quando a hora marcada chega, então o no trabalho nunca acontece.

O mesmo problema ocorre com as entradas crontab .

Estou tentando entender a página man do anacron para o Ubuntu.

Existe uma ferramenta para agendar um trabalho de forma que ele seja executado quando solicitado, ou o mais rapidamente possível, sempre que o servidor estiver on-line novamente?

Ele não precisa estar com anacron , e se for algo que somente root pode usar, então vou apenas invocar minhas invocações com sudo

ESCLARECIMENTO

As tarefas não são alguns scripts fixos (se são), mas muito variáveis, e são condicionais, o que significa que, dependendo do estado imprevisto dentro dos programas, eles podem ou não devem ser programados em primeiro lugar.

Parece que eu tenho que desenvolver meu próprio wrapper em cima de atd / anacron que dá aos meus programas uma interface parecida com at , mas eu esperava que algo já existisse. Foi verificar se fcron se encaixa na fatura e se disponível para o Ubuntu em algum repo.

    
por Marcos 05.03.2012 / 15:25

3 respostas

3

O Anacron é ótimo para o que é ... um sistema para garantir que os jobs sejam executados a cada N número de dias , após a reinicialização - não há muito controle lá. Além disso, não é um daemon residente e, portanto, não pode substituir crond ou atd; ele inicia no momento da inicialização (ou quando chamado manualmente), aguarda os intervalos apropriados antes de verificar algumas condições e, depois que tudo tiver sido verificado ou executado, ele é encerrado.

Dito isto, pode ser útil na sua situação, como um backup para o atd. Você poderia fazer algo como: echo '@monthly 0 custom1timejob script_or_cmd_here' >> /etc/anacrontab

Em seguida, agende seu trabalho, certificando-se de incluir algo no script que permita que a anacron saiba que o trabalho foi executado (fazendo date +%Y%m%d > /var/spool/anacron/custom1timejob ) ou ainda mais simples : apenas remova a entrada de anacrontab ( sed -i /custom1timejob/d /etc/anacrontab ).

Então, na pior das hipóteses, o trabalho deve ser executado na próxima vez que o sistema for inicializado.
(Certifique-se de que as variáveis RANDOM_DELAY e START_HOURS_RANGE em / etc / anacrontab [ver man anacrontab ] , não vai mexer com suas expectativas.)

    
por 05.03.2012 / 19:18
2

Para trabalhos que são executados uma vez, at já faz exatamente o que você precisa. A qualquer momento, atd executará todos os trabalhos agendados que estão além das datas agendadas. Em particular, no momento da inicialização, a inicialização de atd aciona a execução de qualquer trabalho cuja data tenha vencido durante o tempo de inatividade.

Para trabalhos periódicos, você pode combinar uma entrada crontab com horário fixo e uma entrada @reboot crontab. Na entrada @reboot , execute a tarefa apenas se ela não tiver sido feita nas últimas 24 horas (ou o intervalo que você preferir).

42 5 * * * /usr/local/bin/myjob && touch /var/myjob/done
@reboot if [ -z "$(find /var/myjob.done -mtime 1)" ]; then /usr/local/bin/myjob && touch /var/myjob/done; fi
    
por 06.03.2012 / 02:05
1

Esta pode ser uma situação em que a opção batch de at possa ajudar.

Da minha máquina RHEL5 na sandbox, consegui agendar um trabalho em lote dois minutos no futuro, depois parei atd. Eu deixei cinco minutos passar e então comecei a atd novamente. Quando o atd começou, o trabalho em lote foi iniciado imediatamente.

invocação: batch "NOW+2 minutes" ou qualquer entrada de tempo at aceitável.

Eu me deparei com problemas tentando isso no Fedora 16. Mesmo que as man pages que dizem que ele suporta entrada de tempo, o comando relata que ele não aceita argumentos.

    
por 05.03.2012 / 15:47