Перечислите количество запущенных процессов с заданным именем - присвойте переменной - PullRequest
0 голосов
/ 08 ноября 2011

Мне нужно знать, сколько процессов запущено для конкретной задачи (например, количество котов Apache), и если оно равно 1, распечатать PID. В противном случае распечатайте сообщение.

Мне нужно это в скрипте BASH, теперь, когда я выполняю что-то вроде:

result=`ps aux | grep tomcat | awk '{print $2}' | wc -l`

Количество элементов присваивается результату. Ура! Но у меня нет PID. Однако, когда я пытаюсь выполнить это как промежуточный шаг (без wc), я сталкиваюсь с проблемами. Так что, если я сделаю это:

result=`ps aux | grep tomcat | awk '{print $2}'`

Любые попытки изменить результат переменной просто не работают. Я пробовал set и tr (заменить пробелы на разрывы строк), но я просто не могу получить правильный результат. В идеале я хотел бы, чтобы переменная result представляла собой массив с PID в качестве отдельных элементов. Тогда я могу видеть размер, элементы, легко.

Кто-нибудь может подсказать, что я делаю не так? Спасибо, Фил

Обновление:

В итоге я использовал следующий синтаксис:

pids=(`ps aux | grep "${searchStr}"| grep -v grep | awk '{print $2}'`)
number=${#pids[@]}

Ключ заключался в том, чтобы заключить в скобки команды, помеченные галочкой. Теперь переменная pids является массивом и может запрашивать длину и элементы.

Спасибо и Чоробе, и Димитру за их предложения и помощь.

Ответы [ 2 ]

1 голос
/ 08 ноября 2011
pids=($(
    ps -eo pid,command |
    sed -n '/[t]omcat/{s/^ *\([0-9]\+\).*/\1/;p}'
))
number=${#pids[@]}

pids=( ... ) создает массив.$( ... ) возвращает свой вывод в виде строки (аналогично кавычке).Затем sed вызывается из списка всех процессов: для строк, содержащих tomacat ([t] предотвращает включение самого sed), сохраняется и печатается только pid.

1 голос
/ 08 ноября 2011

Возможно, вам потребуется настроить команду pgrep (вам может потребоваться или не потребоваться опция -f ).

_pids=( 
  $( pgrep -f tomcat )
  )

(( ${#_pids[@]} == 1 )) &&
  echo ${_pids[0]} ||
    echo message  

Если вы хотите напечатать число pids (с сообщением):

_pids=(
  $( pgrep -f tomcat )
  )

(( ${#_pids[@]} == 1 )) &&
  echo ${_pids[0]} ||
    echo "${#_pids[@]} running"

Следует отметить, что утилита pgrep и используемый синтаксис не являются стандартными .

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