Domanda

La situazione è la seguente:

Una serie di workstation remote raccoglie i dati di campo e ftp i dati di campo raccolti su un server tramite ftp. I dati vengono inviati come file CSV che viene archiviato in una directory univoca per ogni workstation nel server FTP.

Ogni workstation invia un nuovo aggiornamento ogni 10 minuti, causando la sovrascrittura dei dati precedenti. Vorremmo in qualche modo concatenare o archiviare questi dati automaticamente. L'elaborazione della workstation è limitata e non può essere estesa in quanto è un sistema incorporato.

Un suggerimento offerto è stato quello di eseguire un cronjob nel server FTP, tuttavia esiste una limitazione dei Termini di servizio che consente i cronjob solo a intervalli di 30 minuti poiché è hosting condiviso. Dato il numero di stazioni di lavoro caricate e l'intervallo di 10 minuti tra i caricamenti sembra che il limite di 30 minuti del cronjob tra le chiamate potrebbe essere un problema.

C'è qualche altro approccio che potrebbe essere suggerito? I linguaggi di scripting lato server disponibili sono perl, php e python.

Potrebbe essere necessario l'aggiornamento a un server dedicato, ma mi piacerebbe comunque ottenere input su come risolvere questo problema nel modo più elegante.

È stato utile?

Soluzione

La maggior parte dei moderni Linux supporterà inotify per far sapere al tuo processo quando il contenuto di una directory è cambiato, quindi non è nemmeno necessario effettuare il polling.

Modifica: per quanto riguarda il commento qui sotto di Mark Baker:

" Fai attenzione, poiché riceverai una notifica non appena il file viene creato, non quando viene chiuso. Quindi avrai bisogno di un modo per assicurarti di non raccogliere file parziali. & Quot;

Questo accadrà con l'orologio inotify che hai impostato a livello di directory - il modo per assicurarti di non raccogliere il file parziale è quello di impostare un ulteriore orologio inotify sul nuovo file e cercare l'evento IN_CLOSE in modo che sai che il file è stato scritto completamente.

Dopo aver visto questo processo, puoi eliminare l'orologio inotify su questo nuovo file ed elaborarlo a tuo piacimento.

Altri suggerimenti

Potresti considerare un demone persistente che continua a eseguire il polling delle directory di destinazione:

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

Quindi il tuo cron job può solo provare ad avviare il demone ogni 30 minuti. Se il demone non riesce a catturare il file di blocco, muore, quindi non ci sono preoccupazioni per l'esecuzione di più daemon.

Un altro approccio da considerare sarebbe quello di inviare i file tramite HTTP POST e quindi elaborarli tramite un CGI. In questo modo, garantisci che sono stati trattati correttamente al momento dell'invio.

La limitazione di 30 minuti è davvero piuttosto sciocca. L'avvio dei processi in Linux non è un'operazione costosa, quindi se tutto ciò che stai facendo è verificare la presenza di nuovi file, non c'è motivo di non farlo più spesso. Abbiamo lavori cron che vengono eseguiti ogni minuto e non hanno alcun effetto evidente sulle prestazioni. Tuttavia, mi rendo conto che non è la tua regola e se hai intenzione di rimanere con quel provider di hosting non hai scelta.

Avrai bisogno di un demone long running di qualche tipo. Il modo più semplice è semplicemente sondare regolarmente, e probabilmente è quello che farei. Inotify, in modo da ricevere una notifica non appena viene creato un file, è un'opzione migliore.

Puoi usare inotify da perl con Linux :: Inotify o da Python con pyinotify.

Fai attenzione, poiché riceverai una notifica non appena il file viene creato, non quando viene chiuso. Quindi avrai bisogno di un modo per assicurarti di non raccogliere file parziali.

Con il polling è meno probabile che vedrai file parziali, ma alla fine accadrà e sarà un brutto bug difficile da riprodurre quando succede, quindi è meglio affrontare il problema ora.

Se stai cercando di rimanere con la configurazione del tuo server FTP esistente, ti consiglio di usare qualcosa come inotify o processo demone per guardare le directory di upload. Se sei d'accordo con il passaggio a un altro server FTP, potresti dare un'occhiata a pyftpdlib che è una libreria di server FTP Python.

Ho fatto parte del team di sviluppo di pyftpdlib per un po 'e una delle richieste più comuni era un modo per "elaborare". i file una volta terminato il caricamento. Per questo motivo abbiamo creato un metodo di callback on_file_received () che è stato attivato al completamento di un caricamento (Vedi issue # 79 sul nostro tracker di numeri per dettagli).

Se ti senti a tuo agio in Python, potrebbe funzionare bene eseguire pyftpdlib come server FTP ed eseguire il codice di elaborazione dal metodo di callback. Nota che pyftpdlib è asincrono e non multi-thread, quindi il tuo metodo di callback non può essere bloccato. Se devi eseguire attività di lunga durata, ti consiglio di utilizzare un processo Python separato o un thread per il lavoro di elaborazione effettivo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top