function Unix_GetPidArray()実行結果例
{
$ret = array();
$cmd = "/bin/ps -e -o pid,args";
$fp = popen($cmd, "r");
while( ($line = fgets($fp)) != false ){
$line = ltrim($line);
$pos = strpos($line, " ");
$pid = intval(substr($line, 0, $pos));
$args = substr($line, $pos+1);
if( $pid <= 0 ) continue;
$ret[] = array(
'pid' => $pid,
'args' => $args,
);
}
fclose($fp);
return $ret;
}
$r = Unix_GetPidArray();ps -eを実行した結果をバラして格納しているだけである。/bin/ps -e -o pid,args を実行してみて、[プロセスID]半角スペース[コマンド....]の書式になればそのまま使用可能。違ったときは環境に合わせて$cmdを調整。
echo var_dump($r);
--
Array
(
[0] => Array
(
[pid] => 1
[args] => /sbin/init
)
[1] => Array
(
[pid] => 2
[args] => [kthreadd]
)
[2] => Array
(
[pid] => 3
[args] => [migration/0]
)
[3] => Array
(
[pid] => 4
[args] => [ksoftirqd/0]
)
...略
応用で、プロセスID(int値)を与えるとそのpidがあるかどうか(ps -ef|grep 1111|wc -l 的なもの)、文字列を与えるとその文字列を持つコマンドのプロセスIDを列挙(ps -ef|grep ahoaho 的なもの)の関数。
function Unix_IsPidExisted($pid)
{
$ret = false;
$cmd = "/bin/ps -e -o pid";
$fp = popen($cmd, "r");
while( ($line = fgets($fp)) != false ){
if( intval(trim($line)) === $pid ){
$ret = true;
break;
}
}
fclose($fp);
return $ret;
}
function Unix_GetPidStringMatched($str)
{
$ret = array();
$cmd = "/bin/ps -e -o pid,args";
$fp = popen($cmd, "r");
while( ($line = fgets($fp)) != false ){
if( strpos($line, $str) === FALSE ) continue;
$ret[] = intval(substr(ltrim($line), 0, strpos(ltrim($line), " ")));
}
fclose($fp);
return $ret;
}
/*
実行例:
$ret = Unix_IsPidExisted(4566);
// PID 4566 が存在すれば true が返る
$ret = Unix_GetPidStringMatched('httpd');
// args に httpd を含むPIDを列挙した配列が返る
*/
この部分で、完全一致「===」を使用すると
期待通りの比較ができないかもしれません。