You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes存活探针curl命令无法获取输出,执行报错求助

问题描述

在Kubernetes存活探针(livenessProbe)中执行以下命令时失败:

sh -c reply=$(curl -s -o /dev/null -w %{http_code} http://127.0.0.1:8080/login); if [ "$reply" -lt 200 -o "$reply" -ge 400 ]; then exit 1; fi;

进入容器直接执行该命令时,出现错误:

/bin/sh: 1: [: Illegal number:

执行后查看$reply发现变量无内容,但去掉sh -c前缀后,命令可正常执行,reply能成功获取HTTP状态码。移除curl的-o /dev/null参数也无法解决问题。

解决方法

问题核心是sh -c的参数格式错误,以及未处理curl执行失败时reply为空的情况,修复方案如下:

  • 将整个脚本逻辑作为sh -c的单个参数
    原命令中,sh -c仅接收了reply=$(...)部分,后续if语句被外层shell解析,导致reply变量在子shell外定义,子shell内无法读取。需将完整逻辑用单引号包裹,让sh -c执行完整脚本:
sh -c 'reply=$(curl -s -o /dev/null -w %{http_code} http://127.0.0.1:8080/login); if [ -n "$reply" ] && ([ "$reply" -lt 200 ] || [ "$reply" -ge 400 ]); then exit 1; fi'
  • 增加空值判断,避免数字比较报错
    当curl执行失败(如服务未启动、连接超时)时,reply会是空字符串,直接做数字比较会触发Illegal number错误。加入[ -n "$reply" ]判断,确保仅当reply有有效值时才进行状态码校验。

  • 简化写法(可选)
    可直接利用curl输出结合grep判断,无需额外变量,逻辑更简洁:

sh -c 'curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8080/login | grep -qE "^[23][0-9]{2}$"'

该命令通过grep匹配2xx/3xx状态码,匹配成功返回0(探针正常),失败返回非0(探针失败),规避了变量处理的问题。

内容的提问来源于stack exchange,提问作者SS123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:54:52