Posso executar um cron job com mais frequência do que a cada minuto?

39

É possível executar um cron job a cada 30 segundos sem um comando sleep?

    
por user15336 02.08.2009 / 22:48

8 respostas

37

Se sua tarefa precisa ser executada com frequência, o cron é a ferramenta errada. Além do fato de que ele simplesmente não lança trabalhos com frequência, você também arrisca alguns problemas sérios se o trabalho levar mais tempo para ser executado do que o intervalo entre os lançamentos. Reescreva sua tarefa para daemonizar e executar persistentemente e, em seguida, inicie-a no cron, se necessário (certificando-se de que ela não será reiniciada se já estiver em execução).

    
por 02.08.2009 / 23:05
34

Candidato ao mais criativo uso indevido de um comando do Linux:

nohup watch -n 30 --precise yourprog >/dev/null &

Se yourprog consistir em:

date +%M.%S.%N >> yourprog.out

então yourprog.out pode parecer:

50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676

indicando um bom nível de precisão.

Aqui está uma explicação das partes do comando:

  • nohup - Isto mantém o comando que o segue, watch neste caso, saindo quando o terminal sai.
  • watch - Este programa executa um comando repetidamente. Normalmente, a primeira tela cheia de saída do comando é exibida sempre que watch executa o comando.
  • -n 30 - O intervalo no qual executar o comando. Neste caso, é a cada trinta segundos.
  • --precise - Sem essa opção, watch executa o comando após intervalo segundos. Com ele, cada início do comando começa em o intervalo, se possível. Se essa opção não fosse especificada no exemplo, os horários chegariam mais tarde e mais tarde por mais de 30 segundos, devido ao tempo gasto para iniciar e executar o comando ( yourprog ).
  • yourprog - O programa ou linha de comando para watch executar. Se a linha de comando contiver caracteres especiais para o shell (por exemplo, espaço ou ponto-e-vírgula), ele precisará ser citado.
  • >/dev/null - O maior que redireciona a saída do comando que está sendo executado por watch para um arquivo, /dev/null . Esse arquivo descarta todos os dados gravados nele. Isso impede que a saída seja gravada na tela ou, como o nohup está sendo usado, impede que a saída seja enviada para um arquivo chamado nohup.out .
  • & - O comando watch é executado em segundo plano e o controle é retornado para o terminal ou processo pai.

Observe que nohup , o redirecionamento de saída e o operador de controle de background & não são específicos de watch .

Aqui está uma explicação do exemplo yourprog script:

  • date - Mostra a data e / ou a hora atual. Também pode configurá-los.
  • +%M.%S.%N - especifica o formato de saída para date a ser usado. %M é o minuto atual, %S é o segundo atual e %N é o nanossegundo atual.
  • >> yourprog.out - Isso redireciona a saída do comando date para um arquivo chamado yourprog.out . O double greater-than faz com que a saída seja anexada ao arquivo em cada chamada, em vez de o conteúdo anterior ser sobrescrito.

Editar :

Possivelmente outra coisa que poderia ser abusada (ou talvez seja um uso legítimo) é temporizadores do sistema.

Veja systemd / Timers como um substituto do cron e Os cronômetros systemd em tempo real .

Vou tentar postar um exemplo em breve.

    
por 16.08.2009 / 15:58
14

O Cron é projetado para ser ativado a cada minuto, por isso não é possível fazê-lo sem alguns hacks, por exemplo, dormir como você mencionou.

    
por 02.08.2009 / 22:53
9
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program

Não se esqueça de escrever algo no seu programa para que ele saia se uma instância anterior já estiver em execução.

#!/bin/sh

if ln -s "pid=$$" /var/pid/myscript.pid; then
  trap "rm /var/pid/myscript.pid" 0 1 2 3 15
else
  echo "Already running, or stale lockfile." >&2
  exit 1
fi

É claro que isso ainda deixa uma pequena oportunidade de falha, então pesquise no Google por uma solução melhor aplicável ao seu ambiente.

    
por 16.12.2011 / 20:32
8

Você pode fazer isso com software de terceiros.

Uma opção que funcionou bem para mim é frequente-cron

Ele permite a precisão em milissegundos e lhe dá a opção de adiar a próxima execução até que a atual tenha sido finalizada.

    
por 30.10.2013 / 06:11
2

Eu tenho algumas preocupações:

(1) às vezes um sistema fica ocupado e não pode iniciar as coisas exatamente no segundo ponto, então é possível que ao mesmo tempo você esteja executando um trabalho, outro trabalho iria aparecer e então você tem 2 (ou mais) trabalhos fazendo a mesma coisa. Dependendo do script, pode haver alguma interferência significativa aqui. Assim, codificar em tal script deve conter algum código para garantir que apenas uma instância do script determinado esteja sendo executada ao mesmo tempo.

(2) O script pode ter muita sobrecarga e consumir mais recursos do sistema do que você deseja. Isso é verdade se você estiver competindo contra muitas outras atividades do sistema.

Assim, como um pôster colocou, neste caso eu consideraria seriamente colocar em um daemon rodando com processos adicionais para garantir que ele permaneça em execução se for de importância crítica para suas operações.

    
por 02.08.2009 / 23:26
0

Uma solução, se for para o seu próprio script ou se você puder envolvê-lo:

  1. Obtenha e lembre-se da hora de início.
  2. Se um arquivo de bloqueio, que você tocará mais tarde, estiver presente e o script não estiver em execução por 60 segundos, espere um segundo e verifique novamente. (por exemplo, enquanto / sleep) *
  3. Se o arquivo de bloqueio ainda estiver presente após transcorridos 60 segundos, saia com um aviso de bloqueio antigo.
  4. Toque no arquivo de bloqueio.
  5. Enquanto o script não estiver em execução por 60 segundos, faça o loop de sua tarefa real com a duração de sono desejada.
  6. Excluir arquivo de bloqueio.
  7. Adicione como minuciosamente cron.
  8. Bob é seu tio.

Menos dor de cabeça do que construir e monitorar um daemon.

* Se você estiver usando PHP, lembre-se de clearstatcache ().

    
por 23.05.2015 / 23:31
0

minha solução mais simples e favorita para essa tarefa:

entrada cron: * * * * * flock -w0 /path/to/script /path/to/script

Script

: while true;do echo doing something; sleep 10s;done

alternativa preguiçosa::)

* * * * * flock -w0 /path/to/log watch -n 10 echo doing >> /path/to/log

ou

* * * * * flock -w0 /path/to/log watch -n 10 /path/to/script

pros

  • o uso do comando flock evita a execução do script por várias instâncias ao mesmo tempo. Pode ser muito importante na maioria dos casos.
  • Os comandos flock e watch estão disponíveis na maioria das instalações do Linux

cons

  • a interrupção deste tipo de "Serviço" precisa de dois passos
    • comente a entrada do cron
    • mate o script ou o comando watch
por 17.10.2016 / 15:11