ExecTask를 통해 phing 및 running selenium 서버를 사용하고 있습니다. 때로는 프로세스를 중지하여 서버를 실행하지 않아야합니다.phing에서 exec가 생성되었습니다.
ExecTask에서 생성 된 프로세스의 PID를 가져올 가능성이 있습니까?
ExecTask를 통해 phing 및 running selenium 서버를 사용하고 있습니다. 때로는 프로세스를 중지하여 서버를 실행하지 않아야합니다.phing에서 exec가 생성되었습니다.
ExecTask에서 생성 된 프로세스의 PID를 가져올 가능성이 있습니까?
아니요, 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
으로 죽일 수 있습니다.
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
루프를 사용하는 것이 출력에서 완전하고 읽을 수있는 텍스트를 표시합니다.
나는 이것이 당신이 찾고있는 것과 유사하기를 바랍니다.
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가 아닌.
이것은 가장 직접적이고 최적의 해결책은 아니지만 작동하지는 않습니다.
필자는 시작한 프로그램의 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" />
혹시 이것에 대한 해결책을 찾았나요? 테스트가 끝난 후에도 셀레늄 서버를 죽이고 싶습니다. – papaiatis