Я пишу сценарий PHP, который подключается к удаленному серверу, используя SSH. мне нужно проверить, запущен ли определенный процесс или нет, чтобы я мог его прекратить. Я использую phpseclib. следующий код подключается к серверу и перечисляет процессы, но я действительно застрял в получении идентификатора процесса каждого процесса!
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), используя разрывы строк и слов, но безуспешно. Кто-нибудь имеет представление о такой проблеме?
Если вы знаете, что они работают от имени пользователя 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);
буду работать. Кстати, имя пользователя regex было взято отсюда: https://stackoverflow.com/a/6949914/171318 Спасибо!
Вы можете сделать что-то вроде этого, я знаю, что это не очень удачное решение, но оно будет служить вашей цели:
$arr = explode(' ',$ps);
for ($i=1; $i<count($arr); $i=$i+3)
echo $arr[$i];