如何在Bash脚本中循环等待命令返回零退出码?
Bash脚本正确实现
你可以直接使用下面的脚本完成需求:
#!/bin/bash # 执行supervisor重载 supervisorctl reload # 轮询检测状态,直到返回0退出码 until supervisorctl status; do sleep 1 done
实现说明
- 核心用Bash原生的
until循环实现逻辑:until会反复执行后面的命令,仅当命令退出码为0时终止循环,完全匹配需求,比手动写while循环判断$?返回值更简洁可靠。 - 循环内加
sleep 1是必须的优化:如果不加间隔,脚本会无间断高频调用supervisorctl,平白消耗CPU和supervisor的socket连接资源,你可以根据实际场景调整间隔时长,比如服务启动慢就改成sleep 2,需要更快响应就改成sleep 0.5。
可选调整
如果你不需要每次检测时打印supervisorctl status的进程状态输出,可以把检测行改成静默模式,只保留重试逻辑:
#!/bin/bash supervisorctl reload echo "等待supervisor服务就绪..." until supervisorctl status > /dev/null 2>&1; do echo "服务未就绪,1秒后重试" sleep 1 done echo "supervisor状态正常"
如果你的环境中
supervisorctl需要指定配置路径、访问权限或者socket地址,直接给命令加上对应参数即可,例如supervisorctl -c /your/path/supervisord.conf reload,检测部分的命令参数和你手动执行能正常返回的参数保持一致就行。
内容的提问来源于stack exchange,提问作者Barney Szabolcs
相关产品推荐
相关产品推荐

