arquivos de texto processo ftp'ed em um conjunto de diretórios em um servidor hospedado

StackOverflow https://stackoverflow.com/questions/208772

Pergunta

A situação é a seguinte:

Uma série de estações de trabalho remotas coletar dados de campo e ftp os dados de campo coletados para um servidor através de FTP. Os dados são enviados como um arquivo CSV, que é armazenado em um diretório único para cada estação de trabalho no servidor FTP.

Cada estação de trabalho envia uma nova atualização a cada 10 minutos, fazendo com que os dados anteriores para ser substituído. Nós gostaríamos de alguma forma concatenate ou armazenar esses dados automaticamente. processamento da estação de trabalho é limitado e não pode ser estendido como é um sistema embarcado.

Uma sugestão oferecida foi para executar um cron no servidor de FTP, no entanto, há um Termo de restrição de serviço para permitir que apenas cronjobs em intervalos de 30 minutos, como é de hospedagem compartilhada. Dado o número de estações de trabalho upload e o intervalo de 10 minutos entre os envios parece que limite de 30 minutos do cronjob entre chamadas pode ser um problema.

Existe alguma outra abordagem que pode ser sugerido? As linguagens de script do lado do servidor estão disponíveis Perl, PHP e Python.

A atualização para um servidor dedicado pode ser necessário, mas eu ainda gostaria de receber sugestões sobre como resolver este problema da forma mais elegante.

Foi útil?

Solução

A maioria moderno do Linux vai apoiar inotify para deixar o seu processo de saber quando o conteúdo de um diretory mudou, assim você não precisa mesmo de pesquisa.

Edit: Com relação ao comentário abaixo de Mark Baker:

"Tenha cuidado, porém, como você vai ser notificado assim que o arquivo é criado, não quando ele está fechado. Assim você precisa de alguma maneira para se certificar de que você não pegar arquivos parciais".

Isso vai acontecer com o relógio inotify você definir no nível do diretório - o caminho para se certificar de que você então não pegar o arquivo parcial é definir um novo relógio inotify no novo arquivo e olhar para o evento IN_CLOSE assim que você sabe que o arquivo tenha sido escrito completamente.

Uma vez que o processo tenha visto isso, você pode excluir o relógio inotify sobre este novo arquivo e processá-lo em seu lazer.

Outras dicas

Você pode considerar um daemon persistente que mantém votação os diretórios de destino:

grab_lockfile() or exit();
while (1) {
    if (new_files()) {
        process_new_files();
    }
    sleep(60);
}

Em seguida, o seu trabalho cron pode apenas tentar iniciar o daemon a cada 30 minutos. Se o daemon não pode pegar o lockfile, ele só morre, então não há nenhuma preocupação sobre vários daemons em execução.

Outra abordagem a considerar seria a de enviar os arquivos via HTTP POST e, em seguida, processá-los através de um CGI. Desta forma, você garante que elas foram tratadas adequadamente no momento da submissão.

A limitação 30 minutos é muito bobo realmente. Começando processos no Linux não é uma operação cara, por isso, se tudo o que você está fazendo é verificar se há novos arquivos não há nenhuma boa razão para não fazê-lo mais vezes do que isso. Temos cron trabalhos que são executados a cada minuto e eles não têm qualquer efeito perceptível no desempenho. No entanto, eu percebo que não é a sua regra e se você estiver indo para ficar com esse provedor de hospedagem não tem uma escolha.

Você vai precisar de um daemon de longa duração de algum tipo. A maneira mais fácil é apenas para pesquisa regularmente, e, provavelmente, isso é o que eu faria. Inotify, assim você ser notificado assim que um arquivo é criado, é uma opção melhor.

Você pode usar inotify do perl com Linux :: Inotify, ou a partir de python com pyinotify.

Tenha cuidado, porém, como você vai ser notificado assim que o arquivo é criado, não quando ele está fechado. Então você vai precisar de alguma maneira de certificar-se de que você não pegar arquivos parciais.

Com polling é menos provável que você vai ver os arquivos parciais, mas isso vai acontecer, eventualmente, e será um bug-to hard-reproduzir desagradável quando isso acontecer, então é melhor para lidar com o problema agora.

Se você estiver olhando para ficar com a sua configuração de servidor FTP existente, então eu aconselho usar algo como processo inotify ou daemon para ver os diretórios de upload. Se você estiver ok com a mudança para um servidor FTP diferente, que você pode dar uma olhada pyftpdlib que é um lib servidor Python FTP.

Eu tenho sido uma parte da equipe de desenvolvimento para pyftpdlib um tempo e um dos pedidos mais comuns foi uma maneira de arquivos "processo" Uma vez que eles upload acabado. Por causa disso, criamos um método on_file_received() callback que é desencadeada na sequência de um upload (Veja edição # 79 em nosso issue tracker para detalhes).

Se você é confortável em Python, então pode funcionar bem para você correr pyftpdlib como seu servidor FTP e executar o seu código de processamento do método de retorno. Note-se que pyftpdlib é assíncrono e não multi-threaded, para que o seu método de retorno não pode estar bloqueando. Se você precisa executar tarefas de longa duração Eu recomendaria um processo de Python em separado ou segmento ser usado para o trabalho de processamento real.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top