BASH-시퀀스 / 증분 된 숫자가있는 grep ps 데이터


0

ps의 프로세스 목록을 반복하는 bash for 루프가 있습니다. 아이디어는 프로세스가 실행 중인지 확인하고 출력을 계산하는 것입니다. 반복되는 예제 목록은 다음과 같습니다.

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 코드는 다음과 같습니다

#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

반복 할 때 name = Philips는 3 (잘못된), name = Philips1 또는 Philips3의 개수를 반환합니다. 1의 수 (원하는). 필립스 라인을 처리하는 방법에 대한 아이디어가 필요하지만 'Host', 'Node'항목을 잘못 계산하지는 않습니다. 아키텍처 관점에서 필립스 프로세스는 고유 한 반면 ClockService는로드 밸런싱됩니다. ClockService의 개수는 2이지만 각 Philips의 개수는 1이어야합니다.


검색 할 수 있습니다. ${name}_즉, 이름이 필립스 인 경우 필립스 1과 일치하지 않습니다. 그런 다음 두 줄 을 병합하려면 ClockService.(와 함께 .) 이름이 필요합니다.ClockService
Stephen Harris

@StephenHarris, 내가 잘하면 더 나은 내가 뭘하려고 오전의 전체 맥락을 설명하는 내 코드 블록을 편집
dolphindiver

1
나는 당신의 배열 / 루프 당신이 생각하는 일을 생각하지 않습니다 : 당신은 요소 인덱스 배열있어 Philips, 1, Node, 1등을. 아마도 당신이 원하는 것은 아마도 다음과 같이 반복 할 수 있는 연관 배열 declare -A procs=( [Philips]=1 [Node]=1 [Host]=1 [Server]=1 [Philips1]=1 [Philips3]=1 [ClockService]=2)입니다for i in "${!procs[@]}"; do name="$i"; configured_count="${procs[$i]}"; done
steeldriver

name=$(echo ... | awk ...)비극입니다. 실제로 배열을 사용하지 않으므로 외부 루프를 다음과 같이 작성하십시오.cat << EOF |\nPhilips 1\nNode 1\n...\nEOF\nwhile read name configured_count; do ....
William Pursell

입력을 기반으로 샘플 출력을 제공하십시오.
agc

답변:


1

아이디어는 grep원하는 것과 더 밀접하게 일치 하는 패턴 을 만드는 것 입니다. 그 기억 .모든 문자와 일치합니다.

예를 들어 BOX.Container_${name}_유용한 패턴이됩니다. 이제 Philips구별된다 Philips1. 항목을 병합하려는 경우 검색 할 수 있습니다 ClockService.. 그 병합합니다 ClockService1ClockService2.

또한 일부 테스트를 단순화 하고 요구 사항 을 피하기 위해 grep -c사용할 수도 있습니다 .[B]OXgrep -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

0

모든 의견과 의견에 감사드립니다. 내가 언급하지 못한 입력에 대한 하나의 추가 요소는 프로세스 유형을 분리하는 접두사이므로 모든 "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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.