ExecTask 経由で ping を使用し、セレン サーバーを実行しています。プロセスを強制終了してサーバーの実行を停止する必要がある場合があります。
ExecTask で生成されたプロセスの PID を取得する可能性はありますか?
ExecTask 経由で ping を使用し、セレン サーバーを実行しています。プロセスを強制終了してサーバーの実行を停止する必要がある場合があります。
ExecTask で生成されたプロセスの PID を取得する可能性はありますか?
いいえ、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
。
exec タスク (この場合はセレン サーバー) から強制終了するプロセスを起動する代わりに。exec タスクを使用してスクリプトを起動します (私は bash を使用しましたが、ruby、python なども動作します)。このスクリプトは目的のタスクを開始し、pid をエコーします。以下で実行する必要なパスと実行可能ファイルに置き換えます。
#!bin/bash
./path_to_executable/process_to_run &
echo $!
「&」は、プロセスをバックグラウンドに送り、ping がプロジェクトのビルドを続行できるようにすることに注意してください。最後の行は、phing exec タスクによってキャプチャされ、ファイルに保存される pid を出力します。この pid を保存するには、出力オプションを phing exec タスクに追加します。
<exec command="your_script" spawn="true" output="./pid.txt" />
output オプションは、exec タスクの出力を現在のディレクトリの pid.txt ファイルに保存します。後で読み取れるようにするには、このファイルを (phing を実行しているユーザーに) chown する必要がある場合があることに注意してください。
別のタスクで、ファイルから pid を読み取り、exec タスクを使用してプロセスを強制終了できます。
<loadfile property="pid" file="./pid.txt" />
<exec command="kill ${pid}" dir="./" />
注: 上記では、kill コマンドの前に sudo を追加する必要がある場合があります (プロセスの所有者とプロセスの開始方法によって異なります)。
オプションですが、pid.txt ファイルを削除するタスクを追加することを検討する価値があります。これにより、(古い pid に基づいて) 間違ったプロセスを強制終了する可能性がなくなります。エラーが発生した場合、pid 以外のものが含まれている可能性があるため、pid.txt ファイルの内容を健全性チェックすることもできます。
これは最も直接的または最適な解決策ではないかもしれませんが、うまくいきます。
exec
可能です。コマンド内の 2 番目のパラメーターについて調べることができます。
exec("Script To Run", $output);
2 番目の変数は、現在実行中のスクリプトの出力を配列形式で取得します。したがって、出力から完全で読み取り可能なテキストを表示するには、foreach
ループを使用します。
exec("ifconfig", $output); // Presuming you are developing for a Linux server
foreach ($output as $outputvar) {
echo $outputvar . "<br>";
}
その後、探している文字列strpos
の情報を から取得するようなものを使用します。$outputvar
これがあなたが探しているものと似ていることを願っています。
起動したプログラムの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" />