Como agendar trabalhos do servidor de maneira mais inteligente do que com o cron?

15

Eu trabalho todos os minutos para reindexar o conteúdo do meu site.

Hoje, o mecanismo de pesquisa morreu e, quando eu entrei, havia centenas de processos órfãos que haviam sido iniciados pelo cron.

Existe outra maneira de usar algum tipo de software existente que me permita executar um trabalho a cada minuto, mas isso não lançará outra instância se esse trabalho não retornar (ou seja, porque o processo do mecanismo de pesquisa falhou)?

    
por John 04.04.2012 / 18:00

4 respostas

27

O problema não está realmente no cron - está no seu trabalho.

Você precisará que seu trabalho interaja com um bloqueio de alguma descrição. A maneira mais fácil de fazer isso é tentar criar um diretório e, se tiver êxito, continue, se não sair. Quando seu trabalho terminar e sair, ele deve remover o diretório pronto para a próxima execução. Aqui está um script para ilustrar.

#!/bin/bash

function cleanup {
    echo "Cleanup"
    rmdir /tmp/myjob.lck
}

mkdir /tmp/myjob.lck ||  exit 1
trap cleanup EXIT
echo 'Job Running'
sleep  60
exit 0

Execute isto em um terminal e antes de 60 segundos rodá-lo em outro terminal ele sairá com o status 1. Assim que o primeiro processo sair, você poderá executá-lo a partir do segundo terminal ...

EDITAR:

Como acabei de aprender sobre o bando, pensei em atualizar essa resposta. O bando (1) pode ser mais fácil de usar. Nesse caso, flock -n pareceria apropriado, por exemplo,

* * * * * /usr/bin/flock -n /tmp/myAppLock.lck /path/to/your/job   

Executaria seu trabalho a cada minuto, mas falharia se o flock não conseguisse obter um bloqueio no arquivo.

    
por 04.04.2012 / 18:22
2

Uma maneira seria fazer com que seu script de reindexe crie um arquivo de bloqueio para verificar se já existe uma instância do script em execução. Você também pode adicionar algum tratamento de exceção para ver se o mecanismo de pesquisa está ativo e em execução.

Uma alternativa mais envolvida seria usar algum tipo de tarefa como Resque e Resque-scheduler:

link

link

Há também Qu e Sidekiq:

link

link

Sim, é tudo orientado para Ruby, mas você pode procurar por "coisas como resque" na linguagem de sua escolha.

    
por 04.04.2012 / 18:27
0

Outra maneira de configurar isso rapidamente é ter um script de shell iniciado quando a máquina é inicializada (o cron pode fazer isso com ' @reboot /path/to/my/script.sh ', então reinicie o cron para iniciá-lo) com algo parecido com isso nele .

#!/bin/sh
/opt/bin/run-site-index
sleep 60
exec $0

O script continua rodando, e você iniciou apenas um - isso é quantos podem ser executados de uma só vez - não mais do que isso. Alguns smarts lá também podem verificar se o indexador está sendo executado e, caso contrário, reiniciar ou tentar corrigir / notificar alguém sobre o problema.

    
por 04.04.2012 / 18:30
-3

Em vez de usar o cron para isso, eu desenvolvo seu trabalho mais como um serviço que é executado em loop e dorme por 60 segundos como a última etapa, ou talvez durma mais vezes em intervalos menores em vários pontos durante o processo para ajudar a espalhar a carga mais uniformemente.

    
por 04.04.2012 / 18:27