Posso tornar o cron "aleatório"?

12

Talvez eu esteja completamente louco, e se assim for - tudo bem. Mas como eu agendaria um trabalho para transmitir, de maneira aleatória, uma mensagem boba, como de fortune?

esclarecimentos
sim - esta é minha estação de trabalho pessoal - não planejo fazer algo complicado em um servidor de produção :)

Warren
fonte

Respostas:

12

atpossui uma interface mais simples para esse tipo de finalidade, se atestiver instalado, a máquina estiver em execução atde o usuário poderá usar o comando

Por exemplo (verifique a sintaxe exata usando man atou info at),

at -f Arquivo now + 53 minutes

ou

at -f Arquivo now + 2 hours

executará os comandos no arquivo especificado em 53 minutos ou 2 horas, respectivamente.

at pode ser reexecutado no início do trabalho agendado com unidades de início, contagem e tempo adequadas (aleatórias ou não).

Editar

Como Arjan aponta útil abaixo, se você estiver usando isso para outro aplicativo que não seja um brinquedo, precisará pensar em questões como o que acontece

  1. se a próxima execução começar antes que a anterior termine (por exemplo, o script é reentrante?) ou

  2. se uma execução não for concluída corretamente ou

  3. se a próxima execução falhar ao iniciar totalmente ou dentro do prazo (por exemplo, o que acontece se a máquina estiver desligada no início da próxima execução) e

  4. sobre o registro e o relatório de execuções com falha ou com êxito.

mas
fonte
essa é uma abordagem que eu não havia considerado - e poderia ser recursiva, se filecontiver a próxima atexecução, correto?
Warren
grande - apenas tentei sair, e funciona muito bem :)
Warren
2
+1, mas algumas coisas a considerar: se o atcomando-é a primeira linha e se o script for executado por um longo período de tempo (ou se os intervalos forem curtos), tenha cuidado ao executar várias instâncias simultaneamente. Mas quando atestá na última linha do script, obviamente não será feito um novo agendamento se o script falhar. Além disso, a execução do script a partir da linha de comando também o fará (re) agendar (e: vários agendamentos poderão existir simultaneamente). Ecron suporta o envio de quaisquer erros (ou: saída em geral) por email; Eu não sei se attem algo assim também?
Arjan
@Arjan - Eu não estou muito preocupado com isso falhando e não me enviando um e-mail .. desde (neste momento) eu estou apenas usando-o para me divertir na minha estação de trabalho :) ... de qualquer maneira - isso é algo para se pensar se isto fosse expandido para, digamos, uma verificação aleatória de intrusão
Warren
o script que eu estou imaginando não se importa quantas cópias de si mesmo estão rodando ao mesmo tempo
Warren
13

Eu tenho muitos comandos no / etc / crontab fazendo todo tipo de coisa e alguns precisam de precisão em segundos. Agora, o cron pode ter uma resolução mais precisa, mantendo todos os horários visíveis e centralizados.

Este exemplo obtém e analisa uma página da Web entre 10 e 50 segundos antes a cada 5 minutos:

4-59/5 * * * * root (sleep $(($RANDOM\%40+10))) && /etc/munin/plugins/someplugin prefetch

Ele não precisa ter um horário exato, pois os dados estão em movimento lento, mas ajuda a manter o tempo de execução do nó munin o mais baixo possível, sem precisar esperar pelas páginas da web. (O plug-in armazena em cache a página por 30 minutos para reduzir ocorrências desnecessárias, mas precisa atualizar um banco de dados a cada 5 minutos).

Observe que \% - cron substitui% por "\ n" - útil para manter o texto do correio em uma linha.

Andy Lee Robinson
fonte
se você estiver cache as páginas da web, você não está necessariamente indo para estar recebendo resultados de carga precisas
Warren
1
sim, eu sei - 'os dados são lentos' - o plug-in obtém taxas de câmbio de um site e eu não quero ser banido. (Não sou comerciante, mas passo muito tempo assistindo aos gráficos de munin). Fiz um plugin semelhante para o clima local. Aplicações sem fim!
Andy Lee Robinson
1
aha! .. abordagem muito legal :)
warren
6

Internamente cron, acho que esse recurso não existe. Eu acho que a melhor solução seria colocar seu comando em um script de shell e colocar um sleepintervalo aleatório na parte superior do script e usar a $RANDOMvariável Em seguida, execute o script uma vez por dia em um trabalho cron regular.

#!/bin/bash
sleep $(($RANDOM%5))
/path/to/command -param1 -param2
John T
fonte
1
sleep () é quase uma garantia de que será morto pelo provedor de serviços. A menos, é claro, que ele seja o provedor de serviços.
Um anão
1
Eu achava que era em sua própria máquina Linux ou algo se hes apresentando fortuna aleatoriamente para alguém
John T
bem, isso é verdade.
Um anão
Por que dormir é uma má ideia? Só
estou
esclareceu a pergunta para @ John T
warren
6

Depende do tipo de intervalo que você procura. mas suponha que você gostaria que o script fosse executado aleatoriamente com uma probabilidade de 1:30 (uma vez a cada 30 minutos)

  • Crie seu script cron por uma peridiocidade de, digamos, 10 minutos. Ele dispara 3 vezes a cada 30 minutos.

  • Dentro do script, use rand como condição para uma instrução if . Você deseja que o rand retorne um número entre 0 e 2. Se for 0, execute o conteúdo da instrução if.

Essencialmente, seu script sempre dispara em um intervalo definido. Mas apenas executará o comando que lhe interessa aleatoriamente. O seu provedor de serviços agradecerá.

Um anão
fonte
@A Anão - obrigado por essa idéia, também - esta seria uma rota ligeiramente mais útil se eu queria para verificar se há intrusões etc sobre alguma base frequente, mas quase-aleatória
Warren