【发布时间】:2023-01-21 09:22:10
【问题描述】:
我已经尝试了很多 SO 答案,但不知何故无法正常工作。
如果 redis 集群不是ok,我正在编写一个 bash 脚本以返回一个非零退出代码。
该脚本稍后将在 docker compose 的 healthcheck 标签中使用。
这是脚本:
#!/bin/bash
result="$(redis-cli -c -p 30006 --raw cluster info | grep cluster_state: | cut -d ":" -f2)"
echo "$result"
if [ "$result" = "fail" ]; then
echo "failed"
exit 1
fi
脚本的输出是:
I have no name!@ae2197466e7b:/data$ ./redis_healthcheck.sh
fail
I have no name!@ae2197466e7b:/data$ echo $?
0
当从容器内部运行命令时,我得到:
I have no name!@ae2197466e7b:/data$ redis-cli -c -p 30006 --raw cluster info | grep cluster_state: | cut -d ":" -f2
fail
I have no name!@ae2197466e7b:/data$ redis-cli -c -p 30006 --raw cluster info
cluster_state:fail
cluster_slots_assigned:16384
cluster_slots_ok:10923
cluster_slots_pfail:0
cluster_slots_fail:5461
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:8
cluster_my_epoch:8
cluster_stats_messages_ping_sent:3660
cluster_stats_messages_pong_sent:3660
cluster_stats_messages_sent:7320
cluster_stats_messages_ping_received:3660
cluster_stats_messages_pong_received:3660
cluster_stats_messages_received:7320
total_cluster_links_buffer_limit_exceeded:0
如图所示,即使结果是 fail,脚本也不会进入 if 块。
【问题讨论】:
-
$result 可能包含
"fail\r"——通过od -c将redis 输出通过管道传输以进行验证。 -
你做的工作比必要的多。
if redis-cli -c - p 30006 --raw cluster info | grep -q cluster_state:fail; then ...; fi。 -
@glennjackman 你是对的!它确实是
\r\n..我使用tr -d '\r\n'删除了它并且它有效..@chepner你摇滚!如果解决方案不简单,它可能不是最好的 - 感谢您提醒我! -
您是否尝试过捕获
stderr以及stdout?
标签: bash