BASH - dados grep ps que possuem números de sequência / incrementos

0

Eu tenho um bash for loop que percorre uma lista de processos do ps. A ideia é ver se o processo está rodando e contar a saída. Uma lista de exemplos a ser iterada está abaixo de

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

meu código bash é o seguinte

#PSUEDO
procs=(
Philips 1
Node 1 
Host 1 
Server 1
Philips1 1
Philips3 1 
ClockService 2)
#END PSUEDO

for (( i=0 ; i<"${#procs[@]}" ; i++ ))
do
  name=$(echo "${procs[i]}" | awk '{print $1}')
  configured_count=$(echo "${procs[i]}" | awk '{print $2}')

  running=()
  while read -r line
  do
    running+=("${line}")
  done < <(ps -u user -f | grep "BOX.${name}" | grep -v grep)

  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

Quando iterar, name = Philips retornará uma contagem de 3 (errado), nome = Philips1 ou Philips3; contagem de 1 (desejado). Eu preciso de algumas idéias sobre como lidar com as linhas da Philips, mas não considero mal as entradas 'Host', 'Node'. Do ponto de vista da arquitetura, os processos da Philips são distintos, enquanto o ClockService, por exemplo, é balanceado de carga. Eu quero dizer que ClockService tem uma contagem de 2, mas cada Philips deve ter uma contagem de 1.

    
por dolphindiver 27.04.2018 / 18:23

2 respostas

0

obrigado pela entrada e comentários de todos. Um elemento adicional para a entrada que eu não mencionei é um prefixo que separa os tipos de processo, então eles não são apenas todos "BOX". Exemplo de entrada 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

Então, o que acabei fazendo é escrever uma condicional com base no tipo (é "CC" ou não?) e, em seguida, executando loops separados sobre isso. Pode não ser o melhor método, mas funciona.

#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
    
por 30.04.2018 / 17:34
1

A ideia é criar um padrão grep que corresponda mais de perto ao que você deseja. Lembre-se de que . corresponde a qualquer caractere.

Portanto, por exemplo, BOX.Container_${name}_ se torna um padrão útil. Agora, Philips é diferente de Philips1 . Onde você deseja mesclar entradas, você pode procurar por ClockService. ; que mesclará ClockService1 e ClockService2 .

Também podemos simplificar alguns dos testes com grep -c e usar [B]OX para evitar o requisito grep -v .

Assim, o código resultante é parecido com:

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"

Neste exemplo, estou cat do arquivo em vez de chamar ps , mas você pode ver como alterar isso.

% 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
    
por 28.04.2018 / 04:48