عملية ملفات نصية ftp القرية إلى مجموعة من الدلائل في استضافة خادم

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

سؤال

الوضع على النحو التالي:

سلسلة من محطات العمل عن بعد جمع البيانات الميدانية و ftp جمع البيانات الميدانية إلى الخادم من خلال ftp.يتم إرسال البيانات كملف CSV التي يتم تخزينها في دليل فريدة من نوعها لكل محطة في ملقم FTP.

كل محطة من محطات العمل بإرسال تحديث جديد كل 10 دقائق ، مما تسبب في البيانات السابقة أن تكون الكتابة.نود أن بطريقة أو بأخرى لسلسلة أو تخزين هذه البيانات تلقائيا.محطة معالجة محدودة و لا يمكن تمديد كما انها جزءا لا يتجزأ من النظام.

أحد الاقتراحات المقدمة لتشغيل cronjob في خادم FTP ، ومع ذلك هناك شروط الخدمة قيود تسمح فقط cronjobs في فترات 30 دقيقة كما انها مشتركة-استضافة.نظرا لعدد من محطات العمل تحميل و 10 دقائق الفاصلة بين التحميلات يبدو cronjob 30 دقيقة الحد بين المكالمات قد يكون مشكلة.

هل هناك أي نهج آخر قد يكون اقترح ؟ المتاحة البرمجة النصية من جانب الخادم لغة perl, php و python.

الترقية إلى خادم مخصص قد يكون من الضروري, ولكن أنا لا تزال ترغب في الحصول على مدخلات بشأن كيفية حل هذه المشكلة في معظم بطريقة أنيقة.

هل كانت مفيدة؟

المحلول

الأكثر حداثة في لينكس ودعم inotify للسماح العملية الخاصة بك عندما يعرفون محتويات diretory قد تغير، لذلك لا تحتاج حتى إلى الاستقصاء.

وتحرير: وفيما يتعلق التعليق أدناه من مارك بيكر:

و"كن حذرا رغم ذلك، كما سيتم إعلامك في أقرب وقت كما يتم إنشاؤه الملف، وليس عندما انها مغلقة، لذلك ستحتاج بعض الطريق للتأكد من أنك لا تلتقط ملفات جزئية."

وهذا يحدث مع الساعات inotify قمت بتعيين على مستوى الدليل - طريقة للتأكد من أنك ثم لا تلتقط الملف الجزئي هو وضع ساعة inotify أخرى على ملف جديد والبحث عن الحدث IN_CLOSE ذلك عليك أن تعرف تمت كتابة الملف إلى تماما.

وبمجرد أن ينظر إلى العملية الخاصة بك هذا، يمكنك حذف الساعات inotify على هذا الملف الجديد، ومعالجته في وقت فراغك.

نصائح أخرى

وكنت قد تنظر الديمون دائم يحفظ الاقتراع الدلائل الهدف:

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

وبعد ذلك وظيفة كرون الخاص بك يمكن أن مجرد محاولة لبدء البرنامج الخفي كل 30 دقيقة. إذا كان الشيطان لا يمكن الاستيلاء على lockfile، فإنه يموت فقط، لذلك ليس هناك قلق حول الشياطين متعددة تعمل.

وثمة نهج آخر للنظر سيكون لتقديم الملفات عبر HTTP POST ثم معالجتها عن طريق CGI. بهذه الطريقة، يمكنك أن تضمن أنه قد تم التعامل معها بشكل صحيح في وقت التقديم.

والقيد 30 دقيقة سخيف جدا حقا. بدء العمليات في لينكس ليست عملية مكلفة، لذلك إذا كان كل ما نقوم به هو التحقق من وجود ملفات جديدة ليس هناك سبب وجيه لعدم القيام بذلك في كثير من الأحيان من ذلك. لدينا كرون الوظائف التي تعمل كل دقيقة وليس لديهم أي تأثير ملحوظ على الأداء. ومع ذلك، وأنا أدرك أنها ليست القاعدة، وإذا كنت تريد الذهاب لالعصا مع أن مزود استضافة لم يكن لديك خيار.

وستحتاج الديمون منذ فترة طويلة من نوع ما. الطريق السهل هو استطلاع فقط بانتظام، وربما هذا ما كنت تفعل. Inotify، حتى تحصل على إخطار أقرب وقت يتم إنشاء ملف، هو الخيار الأفضل.

ويمكنك استخدام inotify من بيرل مع لينكس :: Inotify، أو من الثعبان مع pyinotify.

كن حذرا رغم ذلك، كما سيتم إعلامك في أقرب وقت كما يتم إنشاؤه الملف، وليس عندما يكون مغلقا. لذلك عليك بحاجة إلى طريقة للتأكد من أنك لا تلتقط ملفات جزئية.

ومع الاقتراع فمن غير المرجح سترى الملفات جزئية، ولكن ذلك سيحدث في نهاية المطاف، وسوف تكون سيئة يصعب إعادة إنتاج الأخطاء عندما لا يحدث، لذلك أفضل للتعامل مع المشكلة الآن.

إذا كنت تبحث عن البقاء مع القائمة الخاصة بك FTP server setup ثم أنصح باستخدام ما يشبه inotify أو daemonized عملية مشاهدة تحميل الدلائل.إذا كنت موافق مع الانتقال إلى مختلف FTP server, قد نلقي نظرة على pyftpdlib وهو الثعبان FTP server lib.

لقد كنت جزءا من فريق ديف على pyftpdlib فترة واحدة من أكثر شيوعا الطلبات على طريقة "عملية" الملفات بمجرد الانتهاء من تحميل.بسبب أننا خلق on_file_received() رد الأسلوب الذي أثار على الانتهاء من تحميل (انظر قضية #79 على تعقب المسألة لمزيد من التفاصيل).

إذا كنت مرتاحا في بايثون ثم قد تعمل جيدا بالنسبة لك لتشغيل pyftpdlib الخاص بك بروتوكول نقل الملفات الخادم الخاص بك وتشغيل معالجة رمز من طريقة الاستدعاء.علما بأن pyftpdlib غير متزامن و ليس متعددة الخيوط ، لذلك طريقة الاستدعاء لا يمكن حجب.إذا كنت بحاجة إلى تشغيل طويلة الأمد المهام أنصح منفصلة الثعبان عملية أو موضوع استخدامها في المعالجة الفعلية في العمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top