2012-12-02 2 views
7

私は、ExecTask経由でphingとrunning selenium serverを使用しています。場合によっては、プロセスを強制終了してサーバーを停止する必要があります。phingでspawned execのpidを取得しています

ExecTaskで生成されたプロセスのPIDを取得する可能性はありますか?

+0

を見つけましたか?私は、テストが実行された後にもセレンのサーバーを殺したいと思います。 – papaiatis

答えて

3

いいえ、ExecTaskは、生成されたプロセスのPIDを直接与えることはできません。終了ステータスと出力のみを返します。

ExecTaskで実行するコマンドを変更して、生成されたプロセスのpidを保存することができます。 $!を使用して、最新のバックグラウンドコマンドのPIDを取得することができます。

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を使用できます。 job1を強制終了するには、pid_to_killを$ p1に置き換えます。それ以外の場合は、pidをエコーし​​てその出力から値を使用する必要があります。

これ以外の場合は、pgrep name_of_programがあります。名前を含むすべてのプロセスが表示されます。その後、pkillでそれを殺すことができます。

1

execコマンド内で2番目のパラメータを使用することもできます。

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

第2の変数は、現在実行中のスクリプトの出力を配列形式で取得します。私は、あなたが探している文字列を$outputvarから情報を引き出すためにstrposようなものを使用することになり、その後

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

:だから私はforeachループを使用することになり、出力からの完全かつ読み取り可能なテキストを表示します。

私はこれがあなたが探しているものに似ていることを願っています。

1

execタスク(あなたの場合はselenium server)からkillしたいプロセスを起動する代わりに。 execタスクを使用してスクリプトを起動します(私はbashを使用しましたが、ruby、pythonなども動作します)。このスクリプトは目的のタスクを開始し、pidをエコーし​​ます。実行する必要のあるパスと実行可能ファイルを以下で置き換えます。

#!bin/bash 

./path_to_executable/process_to_run & 
echo $! 

注「&は、」これはバックグラウンドにプロセスを送信し、あなたのプロジェクトをビルド継続するのPhingことができます。最後の行はpidを出力します。この行はキャプチャされ、phing execタスクによってファイルに保存されます。 Phingの幹部タスクに出力オプションを追加PID、これを保存するには:

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

出力オプションは、現在のディレクトリにpid.txtファイルへのexecタスクの出力を保存します。このファイルを(後で読むことができるように)phingを実行しているユーザーにchownする必要があるかもしれないことに注意してください。別のタスクで

、あなたはファイルからのpidを読み、プロセスを強制終了するには、execタスクを使用することができます。

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

注:上記のkillコマンドにsudoを前に付ける必要があるかもしれませんで(それが開始されたどのようにプロセスの所有者に依存し、そして

オプションが、削除するためにタスクを追加して検討する価値。 pid.txtファイル。これにより、間違ったプロセス(古いpidに基づく)を殺す可能性を防ぐことができます。エラーが発生した場合、何かを含む可能性があるため、pid.txtファイルの内容を正当にチェックしたいかもしれません

これは最も直接的または最適な解決策ではありませんが、動作しますが

0

私は打ち上げられたプログラムのPIDを保存するphingタスクを作成してしまい、要求したときに停止します。 Cocur\BackgroundProcessを使用してバックグラウンドでプロセスを開始し、pidも返すことができます。

<?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" /> 
関連する問題