2012-12-02 8 views
7

Ich benutze phing und Selen-Server über ExecTask. Manchmal muss ich den Server stoppen, indem ich den Prozess abbringe.pid der erstellten exec in ping bekommen

Gibt es eine Möglichkeit in Ping von PID Prozess in ExecTask hervorgebracht bekommen?

+0

Haben Sie jemals eine Lösung für diese finden? Ich würde gerne auch den Selenserver nach den Tests ausschalten. – papaiatis

Antwort

3

Nein, ExecTask kann die PID der erzeugten Prozesse nicht direkt angeben. Es kann nur den Exit-Status und die Ausgabe zurückgeben.

Vielleicht können Sie den Befehl ändern, den Sie in ExecTask selbst ausführen, um die PID des erzeugten Prozesses zu speichern. Sie können $! verwenden, um die PID des letzten Hintergrundbefehls abzurufen.

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

Wenn Sie den Selen-Server töten Sie diese in einem anderen ExecTask anrufen:

pkill pid_to_kill 

Ich bin nicht sicher, ob die Änderungen in Shell-Umgebung mit ExecTask bleiben oder nicht. Wenn ja, können Sie $p1 verwenden. Ersetzen Sie pid_to_kill durch $ p1, um Job1 zu beenden. Sonst müssen Sie die PID wiederholen und den Wert aus der Ausgabe verwenden.

Andernfalls müssen Sie pgrep name_of_program tun. Es gibt alle Prozesse, die den Namen enthalten. Dann können Sie es mit pkill töten.

1

Es ist möglich, Sie könnten über den zweiten Parameter innerhalb des exec Befehls gehen.

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

Die zweite Variable ruft die Ausgabe des aktuell ausgeführten Skripts in einem Array-Format ab. So zeigt den vollständigen und lesbaren Text aus dem Ausgang würde ich eine foreach Schleife verwenden:

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

Danach würde ich so etwas wie strpos verwenden, um die Informationen aus den $outputvar für die Zeichenfolge zu ziehen, die Sie suchen.

Ich hoffe, dass dies etwas ist, was Sie suchen.

1

Anstatt den Prozess zu starten, den Sie von der Exec-Task (Selenserver in Ihrem Fall) töten möchten. Benutze die exec-Aufgabe, um ein Skript zu starten (ich habe Bash benutzt, aber Ruby, Python usw. funktionieren auch). Dieses Skript startet die gewünschte Aufgabe und echo die PID. Ersetzen Sie den erforderlichen Pfad und die ausführbare Datei, die Sie im Folgenden ausführen möchten.

#!bin/bash 

./path_to_executable/process_to_run & 
echo $! 

Beachten Sie die „&“ dieser sendet den Prozess in den Hintergrund und ermöglicht phing Aufbau Ihres Projekts fortzusetzen. Die letzte Zeile gibt die PID aus, die dann von der phing exec-Aufgabe erfasst und in einer Datei gespeichert werden kann. So speichern Sie diese pid die Ausgabeoption zur phing exec Aufgabe hinzufügen:

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

die Ausgabeoption wird die Ausgabe der exec Aufgabe einer pid.txt Datei im aktuellen Verzeichnis speichern. Beachten Sie, dass Sie diese Datei (für den Benutzer, der phing ausführt) möglicherweise ändern müssen, damit sie später gelesen werden kann.

In einer separaten Aufgabe, können Sie die pid aus der Datei gelesen und dann eine exec Aufgabe, den Prozess zu töten verwenden.

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

Hinweis: in der oben müssen Sie möglicherweise sudo mit dem Kill-Befehl vorangestellt wird (je nachdem, wer den Prozess besitzt, und wie er gestartet wurde

Optional, aber eine Überlegung wert ist das Hinzufügen einer Aufgabe zu entfernen. Die pid.txt-Datei verhindert, dass der falsche Prozess beendet wird (basierend auf einer veralteten PID). Sie sollten auch den Inhalt der pid.txt-Datei überprüfen, da sie im Falle eines Fehlers etwas enthalten könnte anders als das pid.

Während dies möglicherweise nicht die direkteste oder optimale Lösung ist, funktioniert es.

0

Ich habe am Ende eine Phing-Aufgabe erstellen, die die PID des gestarteten Programms speichert und es stoppt, wenn Sie darum bitten. Es verwendet Cocur\BackgroundProcess, um den Prozess im Hintergrund zu starten und kann auch die PID zurückgeben.

<?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; 
    } 

} 

Verbrauch:

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