BASH - данные grep ps с порядковыми / увеличенными номерами

setmask была командой, доступной в UNOS (с 1980 года).

С более давних пор команда umask предоставляет аналогичные возможности.

Вызовите:

umask -S, чтобы получить инвертированную маску в виде символьного режима chmod.

umask u=rwx,g=rx,o=rx для получения эквивалента uask 022.

Таким образом, ваше желание уже реализовано.

0
27.04.2018, 19:42
2 ответа

спасибо всем за участие и комментарии. Один дополнительный элемент ввода, который я не упомянул, — это префикс, который разделяет типы процессов, поэтому они не просто «BOX». Пример ввода ps

BOX.CC_Container_Philips1_Primary_X1
BOX.CC_Container_Philips_Primary_X1
BOX.CC_Container_Philips3_Primary_X1
BOX.Container_Server1_X1
BOX.Container_Node1_X1
BOX.Container_Host1_X1
BOX.Container_ClockService1_X1
BOX.Container_ClockService2_X1

так что в итоге я написал условное выражение, основанное на типе (это "CC" или нет? ), а затем запустить отдельные циклы. Может быть, это не лучший метод, но он работает.

#name = list of process names from SQL, parsed into an array
type=$(echo "${name}" | awk -F"_" '{print $1}')
if [[ "${type}" == "CC" ]]; then
while read -r line
do
  running+=("${line}")
done < <(ps -u esmadmin -f | grep "${DOMAIN}.${name}_" | grep -v grep)
else 
  while read -r line
  do
  running+=("${line}")
done < <(ps -u esmadmin -f | grep "${DOMAIN}.${name}" | grep -v grep)
fi
0
28.01.2020, 02:43

Идея состоит в том, чтобы построить шаблон grep, который более точно соответствует тому, что вы хотите. Помните, что .соответствует любому символу.

Так, например, BOX.Container_${name}_становится полезным шаблоном. Теперь Philipsотличается от Philips1. Где вы хотите объединить записи, вы можете искать ClockService.; который объединит ClockService1и ClockService2.

Мы также можем упростить некоторые тесты с помощью grep -cи использовать [B]OX, чтобы избежать требования grep -v.

Итоговый код выглядит примерно так:

declare -A procs=(
[Philips]=1
[Node.]=1 
[Host.]=1 
[Server.]=1
[Philips1]=1
[Philips3]=1 
[ClockService.]=2)

# psout=$(ps -u user -f)
psout=$(cat psout)

for i in "${!procs[@]}"
do
  name=$i
  configured_count=${procs[$i]}

  running=$(echo "$psout" | grep -c "[B]OX.Container_${name}_")

  if [[ "$configured_count" -gt "$running" ]]; then
    result+=$(echo -e "\n[FAIL] ${name} - configured count: ${configured_count} running count: $running")
  elif [[ "$running" -gt "$configured_count" ]]; then
    result+=$(echo -e "\n[WARN] ${name} - configured count: ${configured_count} running count: $running")
  else
    result+=$(echo -e "\n[PASS] ${name} - configured count: ${configured_count} running count: $running")
  fi
done

echo "$result"

В этом примере я catпроверяю файл, а не вызываю ps, но вы можете увидеть, как это изменить.

% cat psout
BOX.Container_Philips1_Primary_X1
BOX.Container_Philips_Primary_X1
BOX.Container_Philips3_Primary_X1
BOX.Container_Server1_X1
BOX.Container_Node1_X1
BOX.Container_Host1_X1
BOX.Container_ClockService1_X1
BOX.Container_ClockService2_X1

% bash code

[PASS] Node. - configured count: 1 running count: 1
[PASS] ClockService. - configured count: 2 running count: 2
[PASS] Philips1 - configured count: 1 running count: 1
[PASS] Philips3 - configured count: 1 running count: 1
[PASS] Server. - configured count: 1 running count: 1
[PASS] Philips - configured count: 1 running count: 1
[PASS] Host. - configured count: 1 running count: 1
1
28.01.2020, 02:43

Теги

Похожие вопросы