TIL: timeout in Bash scripts | Heitor’s log

TL;DR

文章讨论了如何防止脚本在使用until循环等待Web服务器启动失败时进入无限循环的问题。由于timeout命令无法直接作用于until等shell内建命令,解决方法是将until循环封装在bash -c命令中,或者将其移至独立的Bash脚本,然后使用timeout控制整个进程或脚本的执行时间,从而避免无限循环的发生。

Summary

  1. 问题背景:脚本在设置Web服务器后,使用until循环等待其启动,但在服务器启动失败时,脚本会进入无限循环。

  2. timeout命令简介
    • 作用:为命令添加超时限制。
    • 原理:指定等待时间,超时后发送信号终止命令并返回非零退出码。
    • 默认信号SIGTERM,可通过--signal选项修改。
    • 示例timeout 1s sleep 5 在1秒后向sleep命令发送SIGTERM信号。
  3. timeoutuntil的结合问题
    • 直接结合不可行timeout无法直接作用于Bash shell内建命令(如until)。
    • 原因timeout 需要能够结束一个“可kill”的进程,而 until 是 shell 关键字,无法被发送信号。
  4. 解决方案
    • 方法一:包装到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
      
  5. 总结:虽然timeout不能直接与until等shell内建命令一起使用,但通过将其包装在bash -c命令中或使用单独的脚本,可以实现类似的功能,防止脚本进入无限循环。