2012-12-02 18 views
7

Sto usando phing e il server di selenio in esecuzione tramite ExecTask. A volte ho bisogno di smettere di eseguire il server uccidendo il suo processo.ottenere pid di exec generato in phing

C'è una possibilità nel phing di ottenere il PID del processo generato in ExecTask?

+0

Hai mai trovare una soluzione per questo? Mi piacerebbe uccidere anche il server di selenio dopo l'esecuzione dei test. – papaiatis

risposta

3

No, ExecTask non può fornire direttamente il pid dei processi generati. Può solo restituire lo stato di uscita e l'output.

Forse è possibile modificare il comando eseguito in ExecTask per salvare il pid del processo generato. È possibile utilizzare $! per ottenere il pid del comando di sfondo più recente.

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

Quando si vuole uccidere il server di selenio è possibile chiamare questo in un altro ExecTask:

pkill pid_to_kill 

Non sono sicuro se le modifiche apportate in ambiente shell con ExecTask rimanere o meno. In caso affermativo, è possibile utilizzare $p1. Sostituisci pid_to_kill con $ p1 per uccidere job1. Altrimenti dovrai fare eco al pid e usare il valore dal suo output.

Altrimenti si dovrà fare pgrep name_of_program. Darà tutti i processi che contengono il nome. Quindi puoi ucciderlo con pkill.

1

È possibile, è possibile andare sul secondo parametro all'interno del comando exec.

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

La seconda variabile riceve l'uscita dello script corrente circolante in un formato di array. Quindi, per mostrare il testo completo e leggibile dalla uscita vorrei utilizzare un ciclo foreach:

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

Dopo di che, vorrei usare qualcosa come strpos per tirare le informazioni dal $outputvar per la stringa che si sta cercando.

Spero che questo sia qualcosa di simile a quello che stai cercando.

1

Invece di avviare il processo che si desidera eliminare dall'attività exec (server di selenio nel tuo caso). Usa l'attività exec per lanciare uno script (ho usato bash ma anche ruby, python ecc.). questo script avvierà l'attività desiderata e farà eco al pid. Sostituisci il percorso e l'eseguibile richiesti che vuoi eseguire nel sotto.

#!bin/bash 

./path_to_executable/process_to_run & 
echo $! 

Annotare il "&" questo invia il processo per lo sfondo e permette Phing di continuare a costruire il vostro progetto. L'ultima riga emette il pid che può quindi essere catturato e salvato in un file dal task exec di phing. Per salvare questa PID aggiungere l'opzione di uscita per il compito phing exec:

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

l'opzione di uscita salverà l'output dell'attività exec in un file pid.txt nella directory corrente. Nota che potrebbe essere necessario chownare questo file (all'utente che sta eseguendo phing) per consentirne la lettura in seguito.

In un'operazione separata, è possibile leggere il pid dal file e quindi utilizzare un compito exec di uccidere il processo.

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

Nota: nel di cui sopra potrebbe essere necessario anteporre sudo per il comando kill (a seconda di chi possiede il processo, e come è stato avviato

opzionale, ma vale la pena considerare è l'aggiunta di un compito di rimuovere. il file pid.txt. Ciò impedirà qualsiasi possibilità di uccidere il processo sbagliato (basato su un pid stantio). Potresti anche voler controllare il contenuto del file pid.txt poiché, in caso di errore, potrebbe contenere qualcosa diverso dal pid

Mentre questa potrebbe non essere la soluzione più diretta o ottimale, funziona.

0

Ho finito per creare un'attività phing che salva il pid del programma lanciato e lo interrompe quando lo chiedi. Utilizza Cocur\BackgroundProcess per avviare il processo in background e può anche restituire il 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; 
    } 

} 

Usage:

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