ऐसा लगता है कि आप किसी वेब सर्वर से लंबे समय से चल रही प्रक्रियाओं को लॉन्च करने का प्रयास कर रहे हैं और फिर उन प्रक्रियाओं को डेटाबेस में ट्रैक कर रहे हैं। यह असंभव नहीं है, लेकिन अनुशंसित अभ्यास नहीं है।
मुख्य समस्या यह है कि एक HTTP अनुरोध को वर्तमान में आपके वेब सर्वर में संसाधित करने की आवश्यकता है क्योंकि आप वास्तव में करते हैं करते हैं कुछ भी (सिस्टम पर चलने वाली ट्रैक प्रक्रियाओं सहित) -- आपको कुछ ऐसा चाहिए जो हर समय चल सके...
इसके बजाय, एक बेहतर विचार यह होगा कि एक और डिमोनाइज्ड "मैनेजर" प्रक्रिया हो (जैसा कि आप पर्ल का उल्लेख करते हैं, यह इसे लिखने के लिए एक अच्छी भाषा होगी) लंबे समय तक चलने वाले कार्यों (पीआईडी और सिग्नल द्वारा) को स्पॉन और ट्रैक करें, और उसके लिए अपने SQL डेटाबेस को अपडेट करने की प्रक्रिया।
फिर आप अपने "प्रबंधक" प्रक्रिया को अपने वेब सर्वर से एक नई प्रक्रिया शुरू करने के अनुरोधों के लिए सुन सकते हैं। विभिन्न आईपीसी तंत्र हैं जिनका आप उपयोग कर सकते हैं। (जैसे:सिग्नल, SysV shm, यूनिक्स डोमेन सॉकेट, इन-प्रोसेस कतार जैसे ZeroMQ, आदि)।
इसके अनेक लाभ हैं:
- यदि आपकी उत्पन्न स्क्रिप्ट को उपयोगकर्ता/समूह आधारित अलगाव (सिस्टम या एक दूसरे से) के साथ चलाने की आवश्यकता है, तो आपके वेबसर्वर को रूट के रूप में चलाने की आवश्यकता नहीं है, न ही सेटगिड होना चाहिए।
- यदि कोई उत्पन्न प्रक्रिया "क्रैश" हो जाती है, तो "मैनेजर" प्रक्रिया को एक संकेत दिया जाएगा, ताकि यह बिना किसी समस्या के गलत निष्पादन को ट्रैक कर सके।
- यदि आप "प्रबंधक" प्रक्रिया को अनुरोध देने के लिए इन-प्रोसेस क्यू (जैसे:ZeroMQ) का उपयोग करते हैं, तो यह वेब सर्वर से अनुरोधों को "थ्रॉटल" कर सकता है (ताकि उपयोगकर्ता जानबूझकर या गलती से D.O.S का कारण न बन सकें)।
- स्पॉंड प्रक्रिया अच्छी तरह से समाप्त होती है या नहीं, आपको अपने ट्रैकिंग डेटाबेस को अपडेट करने के लिए वेब सर्वर पर 'सक्रिय' HTTP अनुरोध की आवश्यकता नहीं है।
कि क्या कुछ ऐसा है जो चाहिए चल रहा है, यह वास्तव में आपके शब्दार्थ पर निर्भर है। (यानी:क्या यह एक ज्ञात रन टाइम पर आधारित है? खपत किए गए डेटा पर आधारित है? आदि)।
जाँच करें कि क्या यह है दौड़ना दो गुना हो सकता है:
- "प्रबंधक" प्रक्रिया डेटाबेस को उपयुक्त के रूप में अद्यतन करती है, जिसमें उत्पन्न पीआईडी भी शामिल है।
- आपका वेब सर्वर होस्टेड कोड वास्तव में यह निर्धारित करने के लिए प्रक्रियाओं को सूचीबद्ध कर सकता है कि क्या डेटाबेस में पीआईडी वास्तव में है चल रहा है, और यह कितना समय से कुछ उपयोगी कर रहा है!
जाँच करें कि क्या यह नहीं है दौड़ना सम्मेलन पर आधारित होना चाहिए:
- उन प्रक्रियाओं को नाम दें जिनका आप अनुमान लगा सकते हैं।
- यह निर्धारित करने के लिए एक प्रक्रिया सूची प्राप्त करें कि क्या चल रहा है (निष्क्रिय?) जो नहीं होना चाहिए।
किसी भी मामले में, आप या तो उन उपयोगकर्ताओं को सूचित कर सकते हैं जिन्होंने प्रक्रियाओं का अनुरोध किया है और/या वास्तव में इसके बारे में कुछ करते हैं।
एक दृष्टिकोण हो सकता है कि एक CRON कार्य हो जो SQL डेटाबेस से पढ़ता हो और ps
. करता हो यह निर्धारित करने के लिए कि कौन सी उत्पन्न प्रक्रियाओं को पुनरारंभ करने की आवश्यकता है, और फिर पुन:अनुरोध करता है कि "प्रबंधक" प्रक्रिया वेब सर्वर द्वारा उपयोग किए जाने वाले समान आईपीसी तंत्र का उपयोग करके ऐसा करती है। आप अपनी ट्रैकिंग/निगरानी/लॉगिंग में प्रारंभ बनाम पुनरारंभ में कैसे अंतर करते हैं, यह आप पर निर्भर है।
यदि सर्वर स्वयं बिजली खो देता है या क्रैश हो जाता है, तो आप "मैनेजर" प्रक्रिया को पहली बार चलने पर क्लीनअप कर सकते हैं, उदा:
- स्पॉंड प्रक्रियाओं के लिए डेटाबेस में प्रविष्टियां देखें जो सर्वर के बंद होने से पहले कथित रूप से चल रही थीं।
- पीआईडी और रन टाइम . द्वारा उन प्रक्रियाओं की जांच करें (यह महत्वपूर्ण है)।
- या तो उन उत्पन्न प्रक्रियाओं को फिर से शुरू करें जो पूरी नहीं हुई थीं, या वेब सर्वर को यह इंगित करने के लिए डेटाबेस में कुछ संग्रहीत करें कि यह मामला था।
अपडेट #1
आपकी टिप्पणी के अनुसार, आरंभ करने के लिए यहां कुछ संकेत दिए गए हैं:
आपने पर्ल का उल्लेख किया है, इसलिए मान लें कि आपके पास वहां कुछ दक्षता है -- "मैनेजर" प्रक्रिया स्क्रिप्ट लिखने के रास्ते में आपकी सहायता करने के लिए यहां कुछ पर्ल मॉड्यूल दिए गए हैं:
अगर आप पहले से इससे परिचित नहीं हैं CPAN पर्ल मॉड्यूल के लिए भंडार है जो मूल रूप से कुछ भी करता है।
Daemon::Daemonize - प्रक्रिया को निष्क्रिय करने के लिए ताकि यह आपके लॉग आउट करने के बाद भी चलती रहे। डेमॉन को शुरू/बंद/पुनरारंभ करने के लिए स्क्रिप्ट लिखने के तरीके भी प्रदान करता है।
Proc::Spawn
- बाल लिपियों को 'स्पॉनिंग' करने में मदद करता है। मूल रूप से fork()
. करता है फिर exec()
, लेकिन चाइल्ड प्रोसेस के STDIN/STDOUT/STDERR (या यहां तक कि tty) को भी हैंडल करता है। आप इसका उपयोग अपनी लंबे समय से चल रही पर्ल स्क्रिप्ट को लॉन्च करने के लिए कर सकते हैं।
यदि आपका वेब सर्वर फ्रंट-एंड कोड पहले से ही पर्ल में नहीं लिखा गया है, तो आपको कुछ ऐसा चाहिए होगा जो इंटर-प्रोसेस मैसेज-पासिंग और क्यूइंग के लिए काफी पोर्टेबल हो; मैं शायद आपके वेब सर्वर को कुछ आसान तैनाती (जैसे PHP) में फ्रंट एंड बना दूंगा।
यहां दो संभावनाएं हैं (यहां कई हैं) अधिक):
Proc::ProcessTable - आप इस चेक का उपयोग चल रही प्रक्रियाओं पर कर सकते हैं (और ऊपर चर्चा के अनुसार सभी प्रकार के आँकड़े प्राप्त कर सकते हैं)।
Time::HiRes - अपने 'थ्रॉटलिंग' ढांचे को लागू करने के लिए इस पैकेज से उच्च ग्रैन्युलैरिटी टाइम फ़ंक्शंस का उपयोग करें। मूल रूप से केवल उन अनुरोधों की संख्या को सीमित करें जिन्हें आप समय की प्रति यूनिट डी-क्यू करते हैं।
DBI (mysql के साथ ) - अपने MySQL डेटाबेस को "मैनेजर" प्रक्रिया से अपडेट करें।