回答
不,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稱之爲硒服務器:我不知道,如果在shell環境與ExecTask所做的更改留或不
pkill pid_to_kill
。如果是,那麼你可以使用$p1
。用$ p1替換pid_to_kill以殺死job1。否則,您將不得不回顯pid並使用其輸出中的值。
否則你將會做pgrep name_of_program
。它將提供包含名稱的所有進程。然後你可以用pkill
殺死它。
可能的是,您可以參考exec
命令中的第二個參數。
exec("Script To Run", $output);
第二個變量得到的當前運行腳本的以陣列形式的輸出。因此,爲了顯示與輸出的完整和可讀文本,我會用一個foreach
循環:
exec("ifconfig", $output); // Presuming you are developing for a Linux server
foreach ($output as $outputvar) {
echo $outputvar . "<br>";
}
在那之後,我會使用類似strpos
拉從$outputvar
的信息,你正在尋找的字符串。
我希望這是類似於你正在尋找的東西。
而不是從exec任務(您的案例中的selenium服務器)啓動要殺死的進程。使用exec任務來啓動一個腳本(我用bash但ruby,python等也可以)。這個腳本將啓動所需的任務並回顯pid。用下面的代碼替換你想要運行的路徑和可執行文件。
#!bin/bash
./path_to_executable/process_to_run &
echo $!
注意「&」這個發過程爲背景,並允許phing繼續建設項目。最後一行輸出可以由phing exec任務捕獲並保存到文件的pid。要保存該PID輸出選項添加到phing EXEC任務:
<exec command="your_script" spawn="true" output="./pid.txt" />
輸出選項將Exec任務的輸出保存到文件pid.txt在當前目錄中。請注意,您可能需要將此文件(對運行phing的用戶)進行chown以使其稍後能夠被讀取。
在一個單獨的任務,你可以從文件中讀取的PID,然後使用一個exec任務殺死進程。
<loadfile property="pid" file="./pid.txt" />
<exec command="kill ${pid}" dir="./" />
注:以上您可能需要預先sudo來kill命令(取決於誰擁有的過程,以及它是如何開始
可選,但值得考慮的是增加一個任務來刪除。 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" />
- 1. 從exec()獲取pid在php
- 2. 從孩子的派生中獲得atrributes
- 3. perl文件的EXEC PID
- 4. Java - 獲得派生類的類型
- 5. 獲得子進程的PID
- 6. 如何獲得gjs中的進程pid?
- 7. 如何從Windows中的函數exec()獲取PID?
- 8. 取得隱藏的派生
- 9. 如何從通過getRuntime()運行的二進制文件獲得pid exec
- 10. 派生UIElement - 如何獲得焦點
- 11. 如何用exec修改PID?
- 12. 如何獲得衍生java過程的PID
- 13. 如何找到dash-exec命令的PID
- 14. 如何獲得C#中派生類的所有父類反射
- 15. 如何獲得派生類的子類型在基類中
- 16. 獲取的派生接口
- 17. Ruby Net/SSH exec - 獲取遠程進程的pid
- 18. 獲得在C#創建進程的PID
- 19. 如何獲得一個進程的PID?
- 20. 如何獲得管道命令的pid?
- 21. 執行和獲得的pid在Windows
- 22. 獲得擁有PID的套接字fd
- 23. 如何獲得PyWin32進程的PID
- 24. 是否有可能在Windows XP中獲取由exec()啓動的進程的PID?
- 25. 獲得價值exec`叫
- 26. Java運行時的exec()獲得,而
- 27. 使用TPH繼承的LINQ查詢 - 獲得派生類ICollection count
- 28. 在Gameobject上獲得派生類型的屬性
- 29. 溫莎城堡 - 獲得所有從基類派生的課程
- 30. 無法獲得派生的WebDuino類 - 編譯錯誤'Web_HelloWorld.ino'
你有沒有找到一個解決方案?測試結束後,我想殺死硒服務器。 – papaiatis