如何在CI环境中运行bash的watch命令并解决无法停止的问题?
解决CI环境中无法停止watch命令的问题
我之前在CI环境里折腾watch命令时也碰到过一模一样的问题!毕竟CI环境大多是非交互式的,没法像本地终端那样用Ctrl+C手动终止前台运行的watch,尤其是你用它轮询CloudFormation栈事件这种场景,总不能让它一直跑下去占着CI资源对吧?下面给你几个实用的解决办法:
方法1:用timeout命令给watch加超时限制
如果能预估轮询的最长时间,直接用timeout把watch包起来,到时间自动终止:
# 设定5分钟(300秒)后自动停止watch,每5秒轮询一次栈事件 timeout 300 watch -n 5 aws cloudformation describe-stack-events --stack-name YOUR_STACK_NAME
这个方法简单粗暴,适合对轮询时长有预期的场景。
方法2:用watch的-g参数监听输出变化后自动退出
watch自带一个-g(--chgexit)参数,当命令的输出内容发生变化时就自动退出。结合grep过滤目标状态,就能在栈达到预期状态时停止轮询:
# 当栈事件中出现CREATE_COMPLETE时,watch自动退出 watch -t -n 5 -g 'aws cloudformation describe-stack-events --stack-name YOUR_STACK_NAME | grep -q "CREATE_COMPLETE"'
这里-t是去掉watch的头部输出,让结果更干净;-q让grep静默输出,只返回状态码。
方法3:用AWS官方的wait命令替代watch(更推荐!)
其实AWS CLI本身就提供了专门的wait命令来监控CloudFormation栈状态,比自己用watch轮询靠谱多了,它会自动处理轮询逻辑,直到栈达到指定状态才退出:
# 等待栈创建完成,期间自动轮询状态 aws cloudformation wait stack-create-complete --stack-name YOUR_STACK_NAME
除了stack-create-complete,还有stack-update-complete、stack-delete-complete等多种状态可选,完全适配你的场景,而且是官方维护的,稳定性拉满!
方法4:后台运行watch并手动监控进程终止
如果以上方法都不满足你的需求,还可以把watch后台运行,记录它的PID,然后通过脚本监控目标状态,满足条件就杀掉进程:
# 后台运行watch,把输出写入日志文件 watch -n 5 aws cloudformation describe-stack-events --stack-name YOUR_STACK_NAME > stack-events.log & # 记录watch进程的PID WATCH_PID=$! # 循环检查日志中是否出现目标状态 while true; do if grep -q "CREATE_COMPLETE" stack-events.log; then # 杀掉watch进程 kill $WATCH_PID break fi # 每5秒检查一次 sleep 5 done
总结一下,优先用方法3的AWS wait命令,最省心也最符合CloudFormation的使用场景;如果一定要用watch,方法1和2是更简洁的选择。
内容的提问来源于stack exchange,提问作者Mazzy
相关产品推荐
相关产品推荐

