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이어야합니다.
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
name=$(echo ... | awk ...)
비극입니다. 실제로 배열을 사용하지 않으므로 외부 루프를 다음과 같이 작성하십시오.cat << EOF |\nPhilips 1\nNode 1\n...\nEOF\nwhile read name configured_count; do ....
${name}_
즉, 이름이 필립스 인 경우 필립스 1과 일치하지 않습니다. 그런 다음 두 줄 을 병합하려면ClockService.
(와 함께.
) 이름이 필요합니다.ClockService