2010-05-02 21 views
25

मैं यह निर्धारित करने के लिए एक गियरमैन सर्वर से पूछताछ करने में सक्षम होना चाहता हूं कि मेरे द्वारा चलाए जा रहे कार्यकर्ता के कितने उदाहरण हैं (मूल रूप से मैं यह सुनिश्चित करना चाहता हूं कि RunTaskA उपलब्ध है और RunTaskB उपलब्ध है यदि कोई कार्यकर्ता उन कार्यों को संभालने में सक्षम नहीं है, तो मैं चाहता हूं एक चेतावनी बाहर भेजने के लिए सक्षम होगियरमैन प्रशासन तक पहुंचने का कोई तरीका?

वहाँ यह करने के लिए कोई तरीका है

इसके अलावा:।? पागल रंगमंच की सामग्री यदि आप एक PHP रास्ता gearman सर्वर क्वेरी करने के लिए के बारे में पता

संपादित:। मैं PHP गियरमैन एक्सटेंशन के बारे में जानें जो मूल रूप से उपलब्ध है, लेकिन मैं तस की तलाश नहीं कर रहा हूं k सबमिशन एक्सटेंशन, मुझे ऐसा कुछ चाहिए जो मुझे गियरमैन सर्वर से पूछने की अनुमति दे और देखें कि कितने कर्मचारी एक विशिष्ट कार्य की सेवा कर रहे हैं।

उत्तर

34
class Waps_Gearman_Server { 

    /** 
    * @var string 
    */ 
    protected $host = "127.0.0.1"; 
    /** 
    * @var int 
    */ 
    protected $port = 4730; 

    /** 
    * @param string $host 
    * @param int $port 
    */ 
    public function __construct($host=null,$port=null){ 
     if(!is_null($host)){ 
      $this->host = $host; 
     } 
     if(!is_null($port)){ 
      $this->port = $port; 
     } 
    } 

    /** 
    * @return array | null 
    */ 
    public function getStatus(){ 
     $status = null; 
     $handle = fsockopen($this->host,$this->port,$errorNumber,$errorString,30); 
     if($handle!=null){ 
      fwrite($handle,"status\n"); 
      while (!feof($handle)) { 
       $line = fgets($handle, 4096); 
       if($line==".\n"){ 
        break; 
       } 
       if(preg_match("~^(.*)[ \t](\d+)[ \t](\d+)[ \t](\d+)~",$line,$matches)){ 
        $function = $matches[1]; 
        $status['operations'][$function] = array(
         'function' => $function, 
         'total' => $matches[2], 
         'running' => $matches[3], 
         'connectedWorkers' => $matches[4], 
        ); 
       } 
      } 
      fwrite($handle,"workers\n"); 
      while (!feof($handle)) { 
       $line = fgets($handle, 4096); 
       if($line==".\n"){ 
        break; 
       } 
       // FD IP-ADDRESS CLIENT-ID : FUNCTION 
       if(preg_match("~^(\d+)[ \t](.*?)[ \t](.*?) : ?(.*)~",$line,$matches)){ 
        $fd = $matches[1]; 
        $status['connections'][$fd] = array(
         'fd' => $fd, 
         'ip' => $matches[2], 
         'id' => $matches[3], 
         'function' => $matches[4], 
        ); 
       } 
      } 
      fclose($handle); 
     } 

     return $status; 
    } 

} 
+0

Awesomeeeeeeeee –

+4

^उसने क्या कहा। – tambler

0

Gearman has a php extension। क्या आपने अभी तक देखा है?

PHP Link

+1

यह कार्य सबमिट करने के लिए है। मैं पहले से ही इसका उपयोग कर रहा हूं, वह एक्सटेंशन गियरमैन –

1

जहाँ तक मुझे पता है gearman, प्रबंध में ऐसी कोई विस्तार और निगरानी कार्यकर्ता स्क्रिप्ट देखते हैं आपकी जिम्मेदारी है कि आप इस उद्देश्य के लिए इनमें से किसी एक कोशिश कर सकते हैं -

Supervisord के लिए एक अजगर appliation है पृष्ठभूमि में आवेदन चल रहा है और उनकी निगरानी।

या आप उपयोग कर सकते ब्रायन चंद्रमा की gearman manager

+0

के प्रशासनिक पक्ष तक कोई पहुंच प्रदान नहीं करता है, मुझे लगता है कि मुझे कुछ प्रकार की दिल की धड़कन प्रणाली तैयार करनी होगी। –

25

त्वरित जांच के लिए, मैं इस बैश एक लाइनर का उपयोग करें:

# (echo status ; sleep 0.1) | netcat 127.0.0.1 4730 

यह स्थानीय होस्ट पर चल रहे एक gearman उदाहरण के लिए एक कनेक्शन खोलता है, और "स्थिति" क्वेरी भेजता है। इसमें उस उदाहरण पर नौकरियों का नाम और संख्या शामिल है। रिपोर्टिंग और चेतावनी के लिए जानकारी को grep/awk/wc आदि के साथ संसाधित किया जा सकता है।

मैं "श्रमिकों" क्वेरी के साथ भी ऐसा ही करता हूं जो सभी जुड़े श्रमिकों को दिखाता है।

# (echo workers ; sleep 0.1) | netcat 127.0.0.1 4730 

नींद कनेक्शन के लिए लंबे समय तक कनेक्शन को खोलने के लिए है।

प्रशासनिक आदेशों की पूरी सूची है, और क्या उत्पादन का मतलब है, बस "प्रशासनिक प्रोटोकॉल"

+0

बहुत अच्छा, मुझे यह समाधान पसंद है कि यह कितना आसान है। –

4

जरूरत d5ve के जवाब पर विस्तार करने के लिए लगता है http://gearman.org/index.php?id=protocol पर है netcat के बाद से होगा बैठें और सॉकेट पर प्रतीक्षा करें, आप चलाने के लिए अधिकतम सेकंड के साथ एक -w पैरामीटर जोड़ सकते हैं। तो यदि आप स्थानीयहोस्ट से पूछताछ कर रहे हैं:

# (echo status ; sleep 0.1) | netcat 127.0.0.1 4730 -w 1 

... अन्यथा आप कभी भी कमांड प्रॉम्प्ट पर वापस नहीं आते।

0

अजगर में आप निम्न कर सकता है:

import gearman 

admin_client = gearman.GearmanAdminClient(['127.0.0.1:4730',]) 
status = admin_client.get_status() 
for w in status: 
    if w["task"] == "YOUR_TASK_NAME": 
     print(w) 

नोट: यदि आप "gearman" नाम पिप का उपयोग कर पैकेज स्थापित या किसी अपवाद के ऊपर कोड चल रहा से बचने के लिए easy_install किया है।

इसके अलावा, निम्न व्यवस्थापक क्लाइंट की जांच करें जो सामान्य रूप से गियरमैन को प्रशासित करने में सरल हैं।

0

जब सब कुछ विफल रहता है, तो आप उबंटू में gearman-tools पैकेज में पाई gearadmin उपकरण exec() फोन करके उपयोग कर सकते हैंनई प्रक्रिया में इसे निष्पादित करने के लिए। यहां a reference to its output format है।

यह मानता है कि PHP और गियरमैन एक ही सर्वर पर चल रहे हैं।

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