2012-12-02 17 views
7

में स्पॉन्ड किए गए निष्पादन की पिड प्राप्त करना मैं एक्ज़टेस्क के माध्यम से फ़िंग और रनिंग सेलेनियम सर्वर का उपयोग कर रहा हूं। कभी-कभी मुझे अपनी प्रक्रिया को मार कर सर्वर चलाने से रोकना पड़ता है।फिंग

ExecTask में उत्पन्न प्रक्रिया के पीआईडी ​​प्राप्त करने के चरण में कोई संभावना है?

+0

आप कभी भी इस के लिए एक समाधान मिला? परीक्षण के बाद भी मैं सेलेनियम सर्वर को मारना चाहता हूं। – papaiatis

उत्तर

3

नहीं, ExecTask सीधे स्पॉन्ड प्रक्रियाओं की पिड नहीं दे सकता है। यह केवल इसकी निकास स्थिति और आउटपुट लौटा सकता है।

हो सकता है कि आप स्पॉन्डेड प्रक्रिया के पिड को बचाने के लिए ExecTask में चलाए गए आदेश को संशोधित कर सकें। सबसे हालिया पृष्ठभूमि कमांड के ढक्कन को प्राप्त करने के लिए आप $! का उपयोग कर सकते हैं।

job1 &      //start job1 and run in background, end command with & 
p1=$!      //stores the pid 
echo $p1     //gives pid of job1 

आप सेलेनियम सर्वर यदि आप किसी अन्य ExecTask में इस कॉल कर सकते हैं मारने के लिए चाहते हैं:

pkill pid_to_kill 

मुझे यकीन है कि अगर ExecTask साथ खोल वातावरण में किए गए परिवर्तनों को रहने या नहीं। यदि हां तो आप $p1 का उपयोग कर सकते हैं। जॉब 1 को मारने के लिए $ p1 के साथ pid_to_kill को बदलें। अन्यथा आपको पिड को गूंजना होगा और उसके आउटपुट से मूल्य का उपयोग करना होगा।

अन्यथा आप pgrep name_of_program करेंगे। यह नाम वाली सभी प्रक्रियाएं देगा। फिर आप pkill के साथ इसे मार सकते हैं।

1

यह संभव है, आप exec कमांड के अंदर दूसरे पैरामीटर के बारे में जा सकते हैं।

exec("Script To Run", $output); 

दूसरा चर वर्तमान सरणी प्रारूप में वर्तमान चल रहे स्क्रिप्ट का आउटपुट प्राप्त करता है। तो उत्पादन से भरा हुआ है और पठनीय पाठ मैं एक foreach पाश का प्रयोग करेंगे दिखाने के लिए:

exec("ifconfig", $output); // Presuming you are developing for a Linux server 
foreach ($output as $outputvar) { 
    echo $outputvar . "<br>"; 
} 

उसके बाद, मैं स्ट्रिंग जो आप देख रहे हैं के लिए $outputvar से जानकारी खींचने के लिए strpos की तरह कुछ का प्रयोग करेंगे।

मुझे उम्मीद है कि यह कुछ ऐसा है जो आप खोज रहे हैं।

1

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

#!bin/bash 

./path_to_executable/process_to_run & 
echo $! 

नोट "&" इस प्रक्रिया को पृष्ठभूमि के लिए भेजता है और अपनी परियोजना के निर्माण जारी रखने के लिए Phing अनुमति देता है। अंतिम पंक्ति उस पिड को आउटपुट करती है जिसे तब कैप्चर किया जा सकता है और फ़िंग निष्पादन कार्य द्वारा फ़ाइल में सहेजा जा सकता है। इस को बचाने के लिए पीआईडी ​​Phing कार्यकारी कार्य करने के लिए उत्पादन विकल्प जोड़ने:

<exec command="your_script" spawn="true" output="./pid.txt" /> 

उत्पादन विकल्प वर्तमान निर्देशिका में एक pid.txt फाइल करने के लिए कार्यकारी कार्य के उत्पादन में बचत होगी। ध्यान दें कि इसे बाद में पढ़ने के लिए सक्षम करने के लिए आपको इस फ़ाइल को चिह्नित करने की आवश्यकता हो सकती है (उपयोगकर्ता को फ़िंग चल रहा है)।

एक अलग कार्य में, आप फ़ाइल से पीआईडी ​​को पढ़ने और फिर प्रक्रिया को मारने के लिए एक कार्यकारी कार्य का उपयोग कर सकते हैं।

<loadfile property="pid" file="./pid.txt" /> 
<exec command="kill ${pid}" dir="./" /> 

नोट: में आप ऊपर मार आदेश को sudo पहले जोड़ें करना पड़ सकता है (जो प्रक्रिया का मालिक है पर निर्भर करता है, और यह कैसे शुरू किया गया था

वैकल्पिक लेकिन विचार दूर करने के लिए एक कार्य जोड़ने के लायक। pid.txt फ़ाइल। यह गलत प्रक्रिया को मारने की किसी भी संभावना को रोक देगा (एक स्टेल पिड के आधार पर)। आप किसी भी त्रुटि के मामले में pid.txt फ़ाइल की सामग्री की जांच भी कर सकते हैं क्योंकि इसमें कुछ हो सकता है पिड के अलावा

हालांकि यह सबसे प्रत्यक्ष या इष्टतम समाधान नहीं हो सकता है, यह काम करता है।

0

मैंने एक फ़िंग कार्य तैयार किया जो लॉन्च प्रोग्राम की पिड को बचाता है और जब आप इसे पूछते हैं तो यह इसे रोक देता है। पृष्ठभूमि में प्रक्रिया शुरू करने के लिए यह Cocur\BackgroundProcess का उपयोग करता है और पिड भी वापस कर सकता है।

<?php 

require_once "phing/Task.php"; 

class BackgroundExecTask extends Task { 

    protected $command = null; 
    protected $executable = null; 
    protected $id = null; 

    protected static $pidMap = []; 

    public function init() { 
     if (!class_exists('\Cocur\BackgroundProcess\BackgroundProcess')) { 
      throw new BuildException("This task requires the Cocur Background Process componente installed and available on the include path", $this->getLocation()); 
     } 
    } 

    public function main() { 
     switch ($this->command) { 
      case "start": 
       return $this->start(); 
      case "stop": 
       return $this->stop(); 
     } 
    } 

    protected function start() { 
     $process = new \Cocur\BackgroundProcess\BackgroundProcess($this->executable); 
     $process->run(); 
     // you can also return the pid 
     //$this->project->setProperty($this->pidProperty, $process->getPid()); 
     self::$pidMap[$this->id] = $process; 
    } 

    protected function stop() { 
     self::$pidMap[$this->id]->stop(); 
    } 

    public function setCommand($command) 
    { 
     $this->command = "" . $command; 
    } 

    public function setExecutable($executable) 
    { 
     $this->executable = "" . $executable; 
    } 

    public function setId($id) 
    { 
     $this->id = "" . $id; 
    } 

} 

उपयोग:

<backgroundexec id="myprogram" command="start" executable="somebinary" /> 
<backgroundexec id="myprogram" command="stop" />