
我正在编写一个脚本来检查许多应用程序服务。我的脚本在服务中循环。只是寻找对齐输出文本的最佳方法。
这是代码:
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:
会做你想做的事,尽管使用转义码它有点脆弱。
恕我直言,正确的做法是对 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
后你 grep for service
.但是,您需要在循环内 grep for s,否则您只会 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