Executo um trabalho a cada minuto 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 que não iniciará outra instância se esse trabalho não retornar (ou seja, porque o processo do mecanismo de pesquisa falhou)?
cron
scheduled-task
John
fonte
fonte
Respostas:
O problema não é realmente com o cron - é com o 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 for bem-sucedido, continuar, se não sair. Quando seu trabalho terminar e sair, ele deverá remover o diretório pronto para a próxima execução. Aqui está um script para ilustrar.
Execute isso em um terminal e, antes que os 60 segundos terminem, execute-o em outro terminal e ele sairá com o status 1. Quando o primeiro processo terminar, você poderá executá-lo a partir do segundo terminal ...
EDITAR:
Como acabei de aprender sobre o rebanho, pensei em atualizar esta resposta. O rebanho (1) pode ser mais fácil de usar. Nesse caso
flock -n
, pareceria apropriado, por exemploExecutaria seu trabalho a cada minuto, mas falharia se o rebanho não conseguisse obter um bloqueio no arquivo.
fonte
Uma maneira seria fazer com que seu script reindex crie um arquivo de bloqueio para que ele possa verificar se já existe uma instância do script em execução. Você também pode adicionar algum tratamento de exceção para verificar se o mecanismo de pesquisa está em funcionamento.
Uma alternativa mais envolvida seria usar algum tipo de tarefa queuer como Resque e Resque-scheduler:
https://github.com/blog/542-introducing-resque
https://github.com/bvandenbos/resque-scheduler#readme
Há também Qu e Sidekiq:
https://github.com/bkeepers/qu
https://github.com/mperham/sidekiq
Sim, isso é tudo orientado a Ruby, mas você pode procurar por "coisas como resque" no idioma de sua escolha.
fonte
Outra maneira de configurar isso rapidamente é iniciar um script de shell quando a máquina é inicializada (o cron pode fazer isso com '
@reboot /path/to/my/script.sh
',., Em seguida, reinicie o cron para iniciá-lo) com algo assim.O script continua em execução, e você iniciou apenas um - quantos podem estar em execução ao mesmo tempo - não mais do que isso. Alguns especialistas também podem verificar se o indexador está em execução e, se não estiver, reiniciar ou tentar corrigir / notificar alguém sobre o problema.
fonte
Em vez de usar o cron para isso, eu criaria seu trabalho mais como um serviço que é executado em loop e dorme por 60 segundos como a última etapa, ou talvez dorme mais vezes por intervalos menores em vários pontos durante o processo para ajudar a espalhar a carga mais uniformemente.
fonte