여러 가지 응용 서비스를 확인하기 위한 스크립트를 작성 중입니다. 내 스크립트는 서비스에서 반복됩니다. 출력 텍스트를 정렬하는 가장 좋은 방법을 찾고 있습니다.
코드는 다음과 같습니다.
services=(
'MonTier-AppAdmin'
'MonTier-Derby'
'MonTier-es-raw-trans-Nodes-1'
'MonTier-es-raw-trans-Nodes-2'
'MonTier-es-raw-trans-Nodes-3'
'MonTier-es-raw-trans-Nodes-4'
'MonTier-SyslogAgent-1'
'MonTier-SyslogAgent-2'
'MonTier-SyslogAgent-3'
'MonTier-SyslogAgent-4'
'MonTier-WsmAgent-1'
'MonTier-WsmAgent-2'
'MonTier-WsmAgent-3'
'MonTier-WsmAgent-4'
'MonTier-HK-ESRetention'
'MonTier-HK-WdpDeviceResources'
'MonTier-HK-WdpServiceResources'
'MonTier-HK-SyslogKeepalive'
'MonTier-HK-WsmKeepalive'
'MonTier-UI'
'MonTier-Reports'
'MonTier-AgentNode'
'Kibana'
)
servicestat=$(ps -ef | grep -v grep | grep "$services" | wc -l)
for s in ${services[*]}
do
if [ "$servicestat" = "1" ]; then
printf "$s status: \033[0;92mup\e[0m \n"
else
printf "$s status: \033[0;31mDOWN\e[0m \n"
fi
done
내가 받은 결과는 다음과 같습니다.
MonTier-AppAdmin status: up
MonTier-Derby status: up
MonTier-es-raw-trans-Nodes-1 status: up
MonTier-es-raw-trans-Nodes-2 status: up
MonTier-es-raw-trans-Nodes-3 status: up
MonTier-es-raw-trans-Nodes-4 status: up
MonTier-SyslogAgent-1 status: up
MonTier-SyslogAgent-2 status: up
MonTier-SyslogAgent-3 status: up
MonTier-SyslogAgent-4 status: up
MonTier-WsmAgent-1 status: up
MonTier-WsmAgent-2 status: up
MonTier-WsmAgent-3 status: up
MonTier-WsmAgent-4 status: up
MonTier-HK-ESRetention status: up
MonTier-HK-WdpDeviceResources status: up
MonTier-HK-WdpServiceResources status: up
MonTier-HK-SyslogKeepalive status: up
MonTier-HK-WsmKeepalive status: up
MonTier-UI status: up
MonTier-Reports status: up
MonTier-AgentNode status: up
Kibana status: up
출력이 다음과 같도록 스크립트를 수정하려면 어떻게 해야 합니까?
MonTier-AppAdmin status: up
MonTier-Derby status: up
MonTier-es-raw-trans-Nodes-1 status: up
MonTier-es-raw-trans-Nodes-2 status: up
MonTier-es-raw-trans-Nodes-3 status: up
MonTier-es-raw-trans-Nodes-4 status: up
MonTier-SyslogAgent-1 status: up
MonTier-SyslogAgent-2 status: up
MonTier-SyslogAgent-3 status: up
MonTier-SyslogAgent-4 status: up
MonTier-WsmAgent-1 status: up
MonTier-WsmAgent-2 status: up
MonTier-WsmAgent-3 status: up
MonTier-WsmAgent-4 status: up
MonTier-HK-ESRetention status: up
MonTier-HK-WdpDeviceResources status: up
MonTier-HK-WdpServiceResources status: up
MonTier-HK-SyslogKeepalive status: up
MonTier-HK-WsmKeepalive status: up
MonTier-UI status: up
MonTier-Reports status: up
MonTier-AgentNode status: up
Kibana status: up
답변1
:
최종 출력을 유지할 필요가 없다면
column -t -s:
이스케이프 코드를 사용하면 약간 취약하기는 하지만 원하는 대로 수행됩니다.
IMHO 해야 할 올바른 일은 printf에 너비 지정자를 사용하는 것입니다. %
이는 서비스 이름에 해당 날짜가 포함되어 있는 경우에도 오류를 방지할 수 있습니다.
@jesse_b가 pgrep, 인용 등에 대해 말한 내용을 토대로 합리적인 경우 작은 따옴표를 사용합니다.
services=(
'MonTier-AppAdmin'
'MonTier-Derby'
'MonTier-es-raw-trans-Nodes-1'
'MonTier-es-raw-trans-Nodes-2'
'MonTier-es-raw-trans-Nodes-3'
'MonTier-es-raw-trans-Nodes-4'
'MonTier-SyslogAgent-1'
'MonTier-SyslogAgent-2'
'MonTier-SyslogAgent-3'
'MonTier-SyslogAgent-4'
'MonTier-WsmAgent-1'
'MonTier-WsmAgent-2'
'MonTier-WsmAgent-3'
'MonTier-WsmAgent-4'
'MonTier-HK-ESRetention'
'MonTier-HK-WdpDeviceResources'
'MonTier-HK-WdpServiceResources'
'MonTier-HK-SyslogKeepalive'
'MonTier-HK-WsmKeepalive'
'MonTier-UI'
'MonTier-Reports'
'MonTier-AgentNode'
'Kibana'
)
for s in "${services[@]}"; do
printf '%-42s ' "$s status:"
if pgrep "$s"; then
printf '\033[0;92mup\e[0m \n'
else
printf '\033[0;31mDOWN\e[0m \n'
fi
done
여기서는 너비를 42로 하드코딩했지만 서비스 배열이 변경되면 배열을 반복하면서 가장 긴 값을 계산할 수 있습니다.
답변2
스크립트가 생각한 대로 작동하지 않습니다.
pgrep
먼저 대신 사용해야 ps -ef
하지만, 사용하려면 ps -ef
다음이 필요합니다.grep -v grep
뒤쪽에service
그러나 루프 내에서 for s를 grep해야 합니다. 그렇지 않으면 첫 번째 서비스만 grep하고 다른 서비스는 grep하지 않습니다 .
"${services[@]}"
대신에 사용해야합니다${services[*]}
다음은 정상적으로 작동합니다.
services=(
'MonTier-AppAdmin'
'MonTier-Derby'
'MonTier-es-raw-trans-Nodes-1'
'MonTier-es-raw-trans-Nodes-2'
'MonTier-es-raw-trans-Nodes-3'
'MonTier-es-raw-trans-Nodes-4'
'MonTier-SyslogAgent-1'
'MonTier-SyslogAgent-2'
'MonTier-SyslogAgent-3'
'MonTier-SyslogAgent-4'
'MonTier-WsmAgent-1'
'MonTier-WsmAgent-2'
'MonTier-WsmAgent-3'
'MonTier-WsmAgent-4'
'MonTier-HK-ESRetention'
'MonTier-HK-WdpDeviceResources'
'MonTier-HK-WdpServiceResources'
'MonTier-HK-SyslogKeepalive'
'MonTier-HK-WsmKeepalive'
'MonTier-UI'
'MonTier-Reports'
'MonTier-AgentNode'
'Kibana'
)
for s in "${services[@]}"; do
if pgrep -lf "$s" >/dev/null 2>&1; then
printf '%s status:?%b\n' "$s" '\033[0;92mup\e[0m'
else
printf '%s status:?%b\n' "$s" '\033[0;31mDOWN\e[0m'
fi
done | column -s? -t
여기서는 ?
필드 구분 기호로 사용할 수 있도록 및 / 사이에 하나를 인쇄합니다.status:
up
DOWN
column