Bash 脚本执行心跳测试的写法
TIL: timeout in Bash scripts | Heitor’s log
- URL: 原文
- Added At: 2025-05-30 01:17:05
- Link To Text
TL;DR
文章讨论了如何防止脚本在使用until循环等待Web服务器启动失败时进入无限循环的问题。由于timeout命令无法直接作用于until等shell内建命令,解决方法是将until循环封装在bash -c命令中,或者将其移至独立的Bash脚本,然后使用timeout控制整个进程或脚本的执行时间,从而避免无限循环的发生。
Summary
-
问题背景:脚本在设置Web服务器后,使用
until循环等待其启动,但在服务器启动失败时,脚本会进入无限循环。 timeout命令简介:- 作用:为命令添加超时限制。
- 原理:指定等待时间,超时后发送信号终止命令并返回非零退出码。
- 默认信号:
SIGTERM,可通过--signal选项修改。 - 示例:
timeout 1s sleep 5在1秒后向sleep命令发送SIGTERM信号。
timeout与until的结合问题:- 直接结合不可行:
timeout无法直接作用于Bash shell内建命令(如until)。 - 原因:
timeout需要能够结束一个“可kill”的进程,而until是 shell 关键字,无法被发送信号。
- 直接结合不可行:
- 解决方案:
- 方法一:包装到Bash进程:将
until循环封装在bash -c命令中,使timeout能够控制整个循环进程。timeout 1m bash -c "until curl --silent --fail-with-body 10.0.0.1:8080/health; do sleep 1 done" - 方法二:单独的Bash脚本:将
until循环移至独立的Bash脚本,然后使用timeout控制该脚本的执行时间。timeout 1m ./until.sh
- 方法一:包装到Bash进程:将
- 总结:虽然
timeout不能直接与until等shell内建命令一起使用,但通过将其包装在bash -c命令中或使用单独的脚本,可以实现类似的功能,防止脚本进入无限循环。