我如何获得特定过程的pid

时间:2014-12-18 07:01:20

标签: php ssh phpseclib ps

我正在编写一个使用SSH连接到删除服务器的PHP脚本。我需要做的是检查特定进程是否正在运行,以便我可以终止它。我正在使用 phpseclib 。以下代码连接到服务器并列出进程,但我真的陷入获取每个进程的进程ID!

include('Net/SSH2.php');
$ssh = new Net_SSH2('192.168.1.1');
$ssh->login('username', 'password') or die("SSH Login failed");
$ps = $ssh->exec('ps -ef | grep ".php"');
echo $ps; 

输出结果为:

root     32405     1  3 09:45 ?        00:03:30 php /afghanwiz/distributor1.php
root     32407     1  3 09:45 ?        00:03:33 php /afghanwiz/distributor2.php

我试图通过爆炸线条和单词来获取pid(这里是32405和32407),但没有成功。任何人都知道这个问题吗?

2 个答案:

答案 0 :(得分:1)

如果您知道它们以root身份运行,这可能对您有用:

$output = <<<EOF
root     32405     1  3 09:45 ?        00:03:30 php /afghanwiz/distributor1.php
root     32407     1  3 09:45 ?        00:03:33 php /afghanwiz/distributor2.php
EOF;

preg_match_all('/root\s+(\d+)/', $output, $m);
var_dump($m[1]);

如果用户名可以是任何内容,例如:

preg_match_all('/[a-z_][a-z0-9_]{0,30}\s+(\d+)/', $output, $m);

会奏效。顺便说一句,用户名正则表达式取自这里:https://stackoverflow.com/a/6949914/171318谢谢!

答案 1 :(得分:0)

你可以做这样的事情,我知道它不是一个非常技术性的解决方案,但它将满足你的目的:

$arr = explode('     ',$ps);
for ($i=1; $i<count($arr); $i=$i+3)
   echo $arr[$i];