2016-06-01 2 views
1

Работа с простым скриптом bash, который я могу использовать, чтобы в конечном счете сказать мне, запущен ли процесс изгоев, который нам не нужен, - этот в конечном итоге будет работать с другим родительским pid. монитор рода. Там, где у меня проблема, я получаю все конкретные значения, которые я хочу в массив, на который я могу выполнить некоторые действия. Сценарий первый:bash скрипт для сбора pids в массиве

#!/bin/bash 
rmanRUNNING=`ps -ef|grep /etc/process/process.conf|egrep -v grep|wc -l` 

if [ $rmanRUNNING -gt 0 ] 
then 
    rmanPPID=($(ps -ef|grep processname|egrep -v grep|egrep -v /etc/process/process.conf|awk '{ printf $3 }')) 
    for i in "${rmanPPID[@]}" 
    do 
     : 
     echo $i 
    done 
fi 

Таким образом, цель состоит в том, чтобы проверить наличие основного процесса, это один работает с файлом конфигурации в этом, первая переменная говорит мне об этом. Затем, если он работает (на основе countherher than 0), намеревается заполнить массив всеми родительскими pids, исключая то, что будет определено как основной процесс (нам не нужно анализировать этот). Таким образом, в определении массива мы получаем список процессов, имя процесса grep, egrep -v выход grep, также egrep -v «основной» процесс, а затем awk родительских pids, затем перебираем и пытаемся эхо каждого из них индивидуально (больше будет сделано в этом разделе, но это не работает). К сожалению, когда я вывожу $ i, все родительские pids просто объединяются вместе в одну длинную строку. Если я попытаюсь вывести определенный элемент массива, я получаю пустой вывод.

Очевидно, вопрос в том, что не так с моим определением массива, которое препятствует его объявлению в виде массива или какой-то другой странной вещи.

Это на RHEL, 6.2 на тестовой среде, возможно, 7 в производстве к тому времени, когда это будет жить.

Полное раскрытие информации, я инженер по мониторингу, а не SA - определенно не сценарий bash от природы!

Заранее спасибо.

EDIT: только для ясности эхо-сигнал на экране PID не является конечным желаемым выходом, это просто простой способ проверить, что я возвращаю то, что ожидаю. Основываясь на комментарии ниже, я считаю, что вывод типа pgrep является предпочтительным. В конце концов я буду связывать эти pids назад по одному против первоначального процесса, чтобы гарантировать, что он является родителем, и если это не так, я выплю ошибку.

+0

Как насчет простых 'PPIDs = ($ (ps -oppid = $ (pgrep -f 'processname. */etc/process/process.conf')))' – anishsane

+0

Почему вы не знали, использовать '$ (...)' в строке 2, но вы знали, чтобы использовать его в строке 6? –

+0

@EdMorton В строке 2 Я не пытаюсь записывать значения в массив, просто получая подсчет запущенных процессов, соответствующих моим критериям. – billhubb84

ответ

3

Это не так много $i, который будет одним конкатенированным номером, а также что ваш массив является всего лишь одним элементом этого конкатенированного числа. Это связано с тем, что вывод awk объединен вместе без разделителя.

Если вы просто добавить пробел в awk, вы можете получить то, что вы хотите:

rmanPPID=($(ps -ef|grep processname | ... | awk '{ printf "%d ", $3 }')) 

или даже проще, использовать print вместо printf:

rmanPPID=($(ps -ef|grep processname | ... | awk '{ print $3 }')) 

(Спасибо Джонатан Леффлера, см. комментарий ниже.)

+0

Или просто 'print $ 3' будет работать. –

+0

@ JonathanLeffler хорошая точка: я упустил 'printf' против' print'. – Evert

Смежные вопросы