Continue monitorando o servidor da Web e baixando os arquivos recém-adicionados

2

Quais são as melhores maneiras de monitorar continuamente um servidor da Web (HTTP) e baixar o arquivo recém-adicionado com min. atraso (idealmente < 1min. atraso)?

    
por Ryan 10.06.2016 / 06:39

5 respostas

3

Monitoramento

Primeiro de tudo, para o monitoramento, eu recomendo que você use Nagios , a fonte principal é gratuita, mas se você precisar de GUI, você deve pagar para isso, mas vale a pena pagar muito.

Você também pode usar Icinga , PRTG , ou o que mais lhe convier.

O Collectd (Collection Daemon) também é uma ferramenta de monitoramento gratuita que você pode fazer o download usando yum nos derivativos do RHEL ou apt-get nos baseados no Debian. Você pode ler este documento se você queria ir com o Collectd.

Tarefa executando todos os x < 1 minuto

Para a segunda parte da sua pergunta, para fazer um trabalho a cada x tempo em que x é por menos de um minuto periodicamente, como você sabe, não pode usar Cronjobs, pois você pode usar alguns truques explicados por Gilles nesta questão para fazer o que quiser.

Será melhor ter um script para o que você precisa e executá-lo para sempre, mesmo na inicialização, se necessário. Você pode ter uma sintaxe simples, conforme mostrado abaixo:

while true; do yourJob; sleep someTime; done

Ou você pode até usar scripts mais complexos, dependendo do que precisar.

Você também pode usar o comando watch . Por exemplo:

watch -n1  command

Ele executará seu command a cada segundo e para sempre.

Como você deve ter adivinhado, também é possível executar seu script de shell com watch , se precisar ter apenas um script simples em execução a cada x tempo, menos de um minuto, e não um complexo.

A escolha é sua, espero que isso ajude.

    
por 20.08.2016 / 11:18
1

Isso depende de alguns fatores.

Se você tiver controle sobre o servidor da Web, a melhor coisa a fazer seria instalar um serviço (RESTful?) fornecendo o número de arquivos alterados desde a última verificação ou download. Isso minimiza a transferência de dados e a carga no cliente e no servidor. Ainda mais se o upload / modificação de arquivos no servidor puder ser rastreado diretamente, por exemplo no script de upload, em vez de depender do sistema de arquivos.

Se este último, eu iria olhar para alguma solução de monitoramento de arquivos, como famd .

Se você não tiver controle sobre o servidor, precisará fazer modificações antes de poder baixá-las. O mais fácil seria usar algum utilitário web mirroring como o w3mir, já que eles já cuidam da verificação / fornecimento dos cabeçalhos ETag e Last-Modified / If-Modified-Since. Isso significa que você terá que fazer menos chamadas e, portanto, conseguir executar o utilitário com mais frequência.

Quanto a como executar o utilitário, depende de onde ele é executado. Você pode usar um cron job em uma máquina Unix ou apenas executá-lo em um loop.

Se você fizer o primeiro, no entanto, será aconselhável instalar algum tipo de semáforo para impedir que um processo de espelhamento comece antes que a instância anterior seja terminada. Pode ser tão simples quanto criar um arquivo de bloqueio:

if [ -r /tmp/mirror.lock ]; then
    echo "lock file found" | logger -t webmirror
    exit 0
fi
touch /tmp/mirror.lock
...whatever...
rm /tmp/mirror.lock

Mas você também precisará catch de qualquer sinal que possa matar seu script, caso contrário, no caso de um erro temporário, o arquivo de bloqueio pode ser deixado lá e impedir que todas as instâncias sejam executadas, mesmo após o erro ter sido resolvido.

Ou você pode verificar se o arquivo de bloqueio não é mais antigo do que uma quantidade razoável e excluí-lo, ou verificar quantas instâncias do script são encontradas por ps (normalmente uma, a atual; se mais , o atual tinha melhor abortar), e fazer sem o arquivo de bloqueio completamente.

    
por 23.08.2016 / 09:17
0

Você poderia fazer um simples comando curl em uma tarefa cron, mas recomendo que você comece a usar uma solução de monitoramento com recursos de monitoramento da web. Há muitos deles de graça, basta google "Open Source soluções de monitoramento da web" e você terá muitos deles!

    
por 10.06.2016 / 12:36
0

Se você está realmente olhando para arquivos, então você pode fazer o pedido HEAD na URL e o servidor deve retornar uma chave (o 'etag') que irá dizer se o arquivo foi alterado. Em um servidor Apache, isso é baseado no ctime do arquivo, então o etag pode mudar mesmo que o arquivo não o faça.

Mas, como é provável que a rede seja mais cara do que gravar em disco, se você fizer o download do conteúdo do arquivo, também poderá armazená-lo em disco.

Você não diz quantos arquivos ou o tamanho deles são. Se houver um grande número de arquivos ou arquivos, demorará muito tempo para baixar esse script ou se você quiser colocar uma quantidade mínima de carga no servidor, esse script deverá ser alterado para que cada consulta ocorra uma vez por minuto ou com tanta frequência possível se o download demorar mais de um minuto.

Abaixo está um script Ruby muito simples que fará o que você quer:

#! / usr / bin / env ruby

require 'getoptlong'
require 'net/https'
require 'json'
require 'fileutils'

def main(roots, **options)
  cache = Hash.new

  cache = Hash.new
  ok = true
  path = options[:path]
  while (ok)
    roots.each do |root|
      uri = URI.parse(root)
      http = Net::HTTP.new(uri.host, uri.port)
      case uri.scheme
      when 'https'
        http.use_ssl = true
        http.verify_mode = OpenSSL::SSL::VERIFY_NONE
      when 'http'
      else
        raise "unknow type #{uri.to_s}"
      end

      need_get = true
      if (c = cache[uri.request_uri])
        response = http.request(Net::HTTP::Head.new(uri.request_uri))
        if response.code.to_i == 200
          if response['etag'] == c['etag']
            need_get = false
          end
        end
      end

      if need_get
        response = http.request(Net::HTTP::Get.new(uri.request_uri))
        cache[uri.request_uri] = { 'etag' => response['etag'] }
        filename = File.join(path, uri.request_uri)
        need_write = true
        if File.exist?(filename)
          # you could check if the file changed here, but it does not save you much.
        end
        if need_write
          File.open(filename, 'w') { |file| file.write(response.body) }
        end
      end
    end
    sleep 30
  end
end

begin
  main([http://example.com/ten.html, http://example.com/eleven], { path: "/tmp/downloaded_files" })
rescue => error
  puts error
end
    
por 25.08.2016 / 11:48
0

Como a FarazX disse que existem várias soluções de monitoramento como o Nagios, Pandora FMS , ... Mas talvez essas as ferramentas são grandes demais para o seu propósito. Talvez o Uptimerobot seja suficiente para você.

Dê uma olhada nas propostas e escolha o melhor para você, mas lembre-se de que uma solução de monitoramento com mais opções oferece mais possibilidades para o seu ambiente.

    
por 26.08.2016 / 08:56