Shell脚本循环检测API状态问题:需过滤冗余日志提取目标状态
解决Shell脚本提取应用状态行的循环检测问题
以下是优化后的Shell脚本,核心是过滤无关INFO日志、精准提取状态值来控制循环逻辑:
#!/bin/bash # 替换为实际的容器名称和calm命令参数 CONTAINER_NAME="your-container-name" CALM_COMMAND="your-calm-command-args" while true; do # 执行命令并提取状态值:过滤INFO日志,提取目标字段 # 可根据实际输出格式调整grep/awk规则 APP_STATUS=$(sudo docker exec "$CONTAINER_NAME" calm "$CALM_COMMAND" 2>/dev/null | grep -v "INFO" | awk '{print $NF}') # 打印当前状态用于调试 echo "当前应用状态: $APP_STATUS" # 根据状态判断后续操作 case "$APP_STATUS" in SUCCESS|FAILURE) echo "状态达到终止条件,退出循环" exit 0 ;; RUNNING|POLICY_EXEC) echo "应用仍在执行,60秒后再次检测" sleep 60 ;; *) echo "未知状态,60秒后再次检测" sleep 60 ;; esac done
关键优化说明
- 过滤无关输出
- 用
grep -v "INFO"直接排除包含INFO的日志行;如果状态行有固定前缀(比如Status:),改用grep "^Status:"能更精准匹配,避免误过滤有效内容。
- 用
- 精准提取状态值
awk '{print $NF}'提取行内最后一个字段作为状态值;如果状态是行内指定位置的字段(比如Status: SUCCESS中的第二个字段),则改为awk '{print $2}'。- 添加
2>/dev/null将命令错误输出重定向到空,避免无关错误信息干扰状态提取(需要保留错误日志可去掉此部分)。
- 循环逻辑优化
- 用
while true实现无限循环,通过case分支处理不同状态,满足终止条件时调用exit 0退出循环。
- 用
适配实际输出的调整步骤
如果不确定状态行格式,先手动执行命令查看输出:
sudo docker exec your-container-name calm your-calm-command-args
比如输出为:
INFO: Connecting to API
INFO: Loading status data
App Status: POLICY_EXEC
则修改状态提取语句为:
APP_STATUS=$(sudo docker exec "$CONTAINER_NAME" calm "$CALM_COMMAND" | grep "App Status:" | awk '{print $3}')
内容的提问来源于stack exchange,提问作者NagalaeVik
相关产品推荐
相关产品推荐

