2008-09-01 7 views
8

एक PHP स्क्रिप्ट को डिमन के रूप में चलाने का सबसे अच्छा तरीका क्या है, और यह जांचने का सबसे अच्छा तरीका क्या है कि पुनरारंभ करने की आवश्यकता है या नहीं।एक PHP स्क्रिप्ट को डिमन के रूप में चलाने का सबसे अच्छा तरीका क्या है?

मेरे पास कुछ स्क्रिप्ट हैं जिन्हें 24/7 चलाने की आवश्यकता है और अधिकांश भाग के लिए मैं उन्हें nohup का उपयोग करके चला सकता हूं। लेकिन अगर वे नीचे जाते हैं, तो इसकी निगरानी करने का सबसे अच्छा तरीका क्या है ताकि इसे स्वचालित रूप से पुनरारंभ किया जा सके?

+0

पर पढ़ सकते हैं सबसे अच्छा और एकमात्र तरीका प्रक्रिया पर्यवेक्षण है। यह एक बच्चे को मजबूर करने और इसके बाहर निकलने के संकेत को पकड़ने के लिए मूल प्रक्रिया के आसपास घूमता है। अगर निकास संकेत अच्छा नहीं है, तो बच्चे की प्रक्रिया को पुनरारंभ करें। अगर कोई बच्चा मर जाता है, तो माता-पिता (पर्यवेक्षक) इसे पुनरारंभ करेंगे। इस प्रश्न के लिए प्रदान किए गए सभी उत्तरों सबसे अच्छे हैं, क्योंकि कोई भी पर्यवेक्षक का उल्लेख नहीं करता है। –

उत्तर

4

यदि आप ऐसा करने के लिए (उचित) init संरचना का उपयोग नहीं कर सकते हैं (आप साझा होस्टिंग इत्यादि पर हैं), एक स्क्रिप्ट चलाने के लिए क्रॉन का उपयोग करें (यह आपको जो भी भाषा पसंद है) में लिखा जा सकता है मिनट जो जांचते हैं कि वे चल रहे हैं या नहीं, और यदि आवश्यक हो तो उन्हें पुनरारंभ करें।

+0

क्या आप इस बात का विस्तार कर सकते हैं कि "उचित [आईएनजी] (उचित) इनिट संरचना का उपयोग करने के लिए" क्या है और यह स्क्रिप्ट चल रहा है यह सुनिश्चित करने के मुद्दे को कैसे हल करेगा? –

-1

टीबीएच, PHP शायद इसके लिए सबसे अच्छा उपकरण नहीं है, वास्तव में यह नहीं कि इसे किस लिए डिजाइन किया गया था। मैंने स्मृति प्रयासों और अन्य बुरी चीजों के बारे में सुना है जब आप इसे आजमाते हैं। यह भी ध्यान में रखें कि PHP में केवल एक स्क्रिप्ट के निष्पादन के लिए संसाधन आईडी (फ़ाइल हैंडल, डीबी कनेक्शन ect के लिए) की एक सीमित मात्रा है।

कुछ और, शायद पाइथन या पर्ल का उपयोग करने के बेहतर बनें, हालांकि मेरे पास इस तरह के ऐप्स लिखने का कोई वास्तविक अनुभव नहीं है, लेकिन मुझे पता है कि PHP आपके द्वारा किए जाने वाले प्रयासों के लिए सही नहीं है।

+0

अशिष्ट लगने की कोशिश किए बिना, आपको यह जवाब हटाना चाहिए, यह गलत स्तर की गलत जानकारी और ज्ञान की कमी का प्रदर्शन करता है। "संसाधन आईडी की सीमित मात्रा" ऑपरेटिंग सिस्टम द्वारा संचालित की जाती है, PHP द्वारा नहीं। इसलिए किसी भी अन्य भाषा में एक ही सीमा होगी। यह देखते हुए कि PHP सी भाषा के रूप में प्रक्रिया नियंत्रण के लिए एक ही लाइब्रेरी का उपयोग करता है, आप विस्तारित कर सकते हैं कि यह इसके लिए सही उपकरण क्यों नहीं है, क्योंकि आपके पास सी के साथ आपके निपटारे में सटीक समान शक्ति है। मैं किसी विशेष भाषा के नापसंद को समझता हूं, लेकिन मैं जानबूझकर गलत जानकारी फैलाने में कभी नहीं समझ सकता .. –

1

मुझे एक wget चलाने के साथ सफलता मिली है और परिणाम साझा सर्वर पर/dev/null को भेज रहा है।

3

त्वरित और गंदे क्रॉन अपने डेमॉन को पुनः आरंभ करने:

* * * * * USER ps auxww | grep SCRIPTNAME > /dev/null || SCRIPTNAME 

उपयोगकर्ता कि डेमॉन के रूप में और SCRIPTNAME स्क्रिप्ट अपनी स्क्रिप्ट के नाम के साथ चलाता है के साथ उपयोगकर्ता बदलें। इसे /etc/cron.d/restart_php_daemon में चिपकाएं। यह हर मिनट चलना चाहिए। कम से कम चलाने के लिए पहले * से */2 या */5 बदलें।

अद्यतन

आप अपने खुद के crontab में इस डाल रहे हैं:

भागो crontab -e और जोड़ें:

* * * * * ps auxwww | grep SCRIPTNAME > /dev/null || SCRIPTNAME 
+0

यह वास्तव में आसान मुहावरे जैसा दिखता है, लेकिन मुझे यकीन नहीं है कि यह मैक ओएसएक्स पर काम करता है और/या यदि आपके पास रूट पहुंच नहीं है। क्या आपके पास उपयोगकर्ता की अपनी crontab फ़ाइल में प्रविष्टि के बराबर है? – dreeves

+0

जब मैं कमांड लाइन पर "ps auxwww | grep meh" चलाता हूं तो यह लौटाता है: --- उपयोगकर्ता नाम 2803 0.0 0.0 61156 724 अंक/0 एसएन + 06:19 0:00 grep meh --- यदि वास्तव में वह क्रॉन काम करता है, यह कैसे काम करता है? क्या यह क्रॉन से आउटपुट नहीं है? – joedevon

+0

आप पीएस के आउटपुट को प्राप्त करने की कोशिश नहीं कर रहे हैं .. यही कारण है कि आप इसे/dev/null पर रीडायरेक्ट करते हैं। grep ps आउटपुट में SCRIPTNAME की उपस्थिति की जांच कर रहा है। यदि यह वहां है, तो यह 0 लौटाता है, अन्यथा गैर-शून्य। || SCRIPTNAME केवल तभी निष्पादित होगा जब grep गैर-शून्य लौटाता है, जो कमांड प्रारंभ करता है। –

0

मैं एक PHP आधारित स्क्रिप्ट का उपयोग एक डेटाबेस से पढ़ने का और ईमेल भेजें (PEAR Mail_Queue लाइब्रेरी का उपयोग करके)। मैं इसे एक बैश स्क्रिप्ट के भीतर से चलाता हूं और लौटा हुआ परिणाम ("बाहर निकलें $ स्थिति;" से) या तो रोकता है, एक्स सेकंड सोता है, या तुरंत पुनरारंभ होता है। (मेल सिस्टम पर जोर देने से बचने के लिए मैंने PHP स्क्रिप्ट में भार औसत/नींद की जांच भी की है)।

यदि यह लंबे समय तक चलने वाले डेमॉन के लिए था, जो लगातार चल रहा था, तो मैं सहमत हूं, शायद यह चलाने के लिए यह सबसे अच्छी बात नहीं होगी (हालांकि मैंने कुछ सॉकेट सर्वरों के बारे में सुना है जो सफलतापूर्वक दीर्घकालिक चलाते हैं), हालांकि, PHP 5.3 ने अब कचरा संग्रह में सुधार किया है, और अगर स्क्रिप्ट अच्छी तरह से अनियोजित से बाहर निकलने के लिए पर्याप्त रूप से लिखी गई है, तो स्मृति पहले किसी समस्या से बहुत कम होनी चाहिए।

3

हम आउटपुट को मेल करने के लिए हमारे डिमन्स चलाते हैं।

php daemon.php | mail -s "daemon stopped" [email protected] 

इस तरह, जब डिमन बंद हो जाता है, तो यह एक मेल भेजेगा, और हमें उस तरह से अधिसूचित किया जाएगा।

यह अभी भी मैन्युअल रूप से डिमन्स के मैन्युअल पुनरारंभ का मतलब है, लेकिन हम तुरंत जान जाएंगे।आम तौर पर, यदि दास बंद हो जाते हैं, तो इसका मतलब है कि कुछ और है जिसकी देखभाल करने की आवश्यकता है, इसलिए यह आमतौर पर ठीक है।

+0

आप 'stderr' को' stdout' पर रीडायरेक्ट कर सकते हैं और पाइप से पहले '2> और 1' का उपयोग करके मेल भी कर सकते हैं। –

0

मैं मानता हूं कि PHP इसके लिए सबसे अच्छा उपकरण नहीं है, हालांकि मैं समझ सकता हूं कि आप PHP का उपयोग क्यों करना चाहते हैं ताकि आप अपने एप्लिकेशन से घटकों का पुन: उपयोग कर सकें जैसे डाटाबेस एक्सेस, और इसी तरह।

मुझे एक ही समस्या थी और मैं फैट कंट्रोलर विकसित करना समाप्त कर दिया जो सी में लिखा गया एक डिमन है जो PHP स्क्रिप्ट चला सकता है। यह एक बहुप्रचारित डिमन के रूप में भी चलाया जा सकता है, समानांतर में एक स्क्रिप्ट के कई उदाहरण चला रहा है।

वहाँ अधिक जानकारी और उपयोग के मामले यहाँ है: http://www.4pmp.com/fatcontroller/

1

डेमॉन एक लिनक्स प्रक्रिया है जो पृष्ठभूमि में चलती है; अपाचे या mysql daemons हैं। एक लिनक्स पर्यावरण में, हम cronjob का उपयोग कर पृष्ठभूमि प्रोग्राम चला सकते हैं, लेकिन इसमें कुछ सीमाएं हैं, और कुछ परिदृश्यों में यह एक अच्छा विचार नहीं है। उदाहरण के लिए, cronjob का उपयोग करके, अगर हम पहले से समाप्त हो चुके हैं तो हम नियंत्रण नहीं कर सकते हैं। अक्सर यह एक डेमॉन के रूप में एक प्रक्रिया को अधिक सुविधाजनक चलाने के लिए है।

// Daemonize 
$pid = pcntl_fork(); // parent gets the child PID and child gets 0 
if($pid){ // if pid is not 0 
    // Only the parent will know the PID. Kids aren't self-aware 
    // Parent says goodbye! 
    print "Parent : " . getmypid() . " exiting\n"; 
    exit(); 
} 
print "Child : " . getmypid() . "\n"; 

उपरोक्त कोड php में डेमॉन बनाने के तरीके के बारे में बहुत अच्छे लेख से लिया गया है। आप इसे link

संबंधित मुद्दे