2012-12-02 5 views
7

ExecTask를 통해 phing 및 running selenium 서버를 사용하고 있습니다. 때로는 프로세스를 중지하여 서버를 실행하지 않아야합니다.phing에서 exec가 생성되었습니다.

ExecTask에서 생성 된 프로세스의 PID를 가져올 가능성이 있습니까?

+0

혹시 이것에 대한 해결책을 찾았나요? 테스트가 끝난 후에도 셀레늄 서버를 죽이고 싶습니다. – papaiatis

답변

3

아니요, ExecTask는 생성 된 프로세스의 PID를 직접 제공 할 수 없습니다. 종료 상태와 출력 만 반환 할 수 있습니다.

아마도 ExecTask에서 실행하는 명령을 수정하여 생성 된 프로세스의 PID를 저장할 수 있습니다. $!을 사용하면 가장 최근의 백그라운드 명령의 PID를 얻을 수 있습니다.

pkill pid_to_kill 

내가 ExecTask와 쉘 환경에서 변경이있을 아닌지 확실하지 않다 :

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

당신이 다른 ExecTask이를 호출 할 수있는 셀레늄 서버를 죽이고 싶어

. 그렇다면 $p1을 사용할 수 있습니다. job1을 삭제하려면 pid_to_kill을 $ p1로 바꿉니다. 그렇지 않으면 pid를 반향 출력하고 출력에서 ​​값을 사용해야합니다.

그렇지 않으면 pgrep name_of_program을해야합니다. 이름을 포함하는 모든 프로세스를 제공합니다. 그럼 pkill으로 죽일 수 있습니다.

1

exec 명령 내에서 두 번째 매개 변수를 사용할 수도 있습니다.

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

두 번째 변수는 현재 실행중인 스크립트의 출력을 배열 형식으로 가져옵니다. 나는 당신이 찾고있는 문자열의 $outputvar의 정보를 끌어 strpos 같은 것을 사용하는 것이, 그 후

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

: 그래서 나는 foreach 루프를 사용하는 것이 출력에서 ​​완전하고 읽을 수있는 텍스트를 표시합니다.

나는 이것이 당신이 찾고있는 것과 유사하기를 바랍니다.

1

exec 작업 (귀하의 경우에는 selenium 서버)에서 종료하려는 프로세스를 시작하는 대신. exec 태스크를 사용하여 스크립트를 시작하십시오 (bash를 사용했지만 루비, 파이썬 등도 작동합니다). 이 스크립트는 원하는 작업을 시작하고 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 파일에 간부 인 작업의 출력을 저장합니다. 이 파일을 나중에 읽을 수 있도록 (phing을 실행하는 사용자에게) chown해야 할 수도 있습니다.

별도의 작업에서는

, 당신은 파일의 PID를 읽고 다음 프로세스를 종료하기 위해 간부 인 작업을 할 수 있습니다.

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

참고 : 위의가 kill 명령에 sudo를 앞에 추가해야 할 수도 있습니다에 (이 시작된 어떻게 프로세스를 소유 한 사람에 따라, 그리고

옵션 만 제거하는 작업을 추가 고려 가치. pid.txt 파일. 잘못된 프로세스를 죽일 가능성을 방지합니다 (오래된 pid를 기반으로합니다). 오류가 발생했을 때 pid.txt 파일의 내용을 정상적으로 검사 할 수도 있습니다. pid가 아닌.

이것은 가장 직접적이고 최적의 해결책은 아니지만 작동하지는 않습니다.

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" /> 
관련 문제