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
命令中或使用单独的脚本,可以实现类似的功能,防止脚本进入无限循环。