Разбор вывода grep - PullRequest
       4

Разбор вывода grep

1 голос
/ 21 сентября 2011

Я пытаюсь создать диспетчер серверов, и вот что у меня есть:

<?php
$COMMAND = shell_exec('ps ax --format command | grep skulltag');
$arr = explode("./",$COMMAND);
$text = shell_exec('pgrep -u doom');
$arrtext = preg_split('/\s+/', $text);
 for( $i = 1; $i < count($arr); $i++ ) {
    echo $i,". PROCESS ID ",$arrtext[$i]," Command issued: ",$arr[$i];
    echo '<br>';
 }
?>

Как видите, я разделяю строку $ COMMAND с помощью ./ (выполнение файла),Однако по какой-то причине в конце списка есть это:

sh -c ps ax --format command | grep skulltag grep skulltag 

Вот полный вывод для справки:

  1. ИД ПРОЦЕССА 4793 Выпущена команда: skulltag-server
  2. ИД ПРОЦЕССА 4956 Выполнена команда: skulltag-server -port 13000
  3. ИД ПРОЦЕССА 4958 Команда выполнена: skulltag-server -port 13001 sh -c ps ax - команда формата |grep skulltag grep skulltag

Какой самый простой и эффективный способ избавиться от этой линии и как мне это сделать?Спасибо.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2014

Измените это:

ps ax --format command | grep skulltag

На это:

ps ax --format command | grep [s]kulltag

Таким образом, сама команда grep содержит строку '[s] kultag', которой не соответствуетgrep регулярное выражение '[s] kultag'.

Также два предложения: 1. нет гарантии, что ваш начальный ps |grep и ваш последующий pgrep выстроитсяВместо этого используйте один pgrep:

pgrep -afl skulltag

И 2. Ваш цикл for начинается с 1, что пропустит процесс в arr [0].

Ваш php может быть переписан примерно так:это:

$processes = explode("\n", shell_exec('pgrep -afl skulltag'));
foreach($processes as $i => $process) {
    ($pid, $command) = explode(' ',$process,2);
    echo $i+1,". PROCESS ID ",$pid," Command issued: ",$command;
    echo '<br>';
}
1 голос
/ 21 сентября 2011

Мое быстрое и грязное решение - добавить | grep -v grep к команде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...