Bash脚本:长睡眠期间IP不可用时如何唤醒并退出?
解决睡眠期间持续检查IP可用性并提前退出的问题
你当前的脚本在检测到目标IP的5060端口可用后,会进入10分钟的固定睡眠,但无法在睡眠过程中响应IP不可用的情况。要实现「睡眠时持续检查IP状态,一旦不可用就立即退出睡眠」的需求,有两种实用的解决方案:
方案一:拆分睡眠为多次短睡眠+循环检查
把10分钟的长睡眠拆分成多次短睡眠,每次醒来后立即检查IP状态,若发现不可用则终止循环。这种方式逻辑直观,容易调试:
# 定义复用的IP端口检查函数 check_ip_available() { # 静默执行检查,丢弃所有输出 timeout 10 bash -c "</dev/tcp/$IP/5060" >/dev/null 2>&1 return $? } # 初始检查IP状态 if check_ip_available; then echo "Primary DC is available..Proceeding to sleep with periodic checks" # 循环60次,每次睡10秒,总时长600秒(10分钟) for ((loop_count=0; loop_count<60; loop_count++)); do sleep 10 # 检查IP是否仍可用,不可用则跳出循环 if ! check_ip_available; then echo "Primary DC is no longer available, exiting sleep early" break fi done # 在这里添加IP不可用后需要执行的端口阻止代码 else echo "Primary DC is not available, executing port block immediately" # 插入阻止入站流量的代码 fi
说明:
- 把检查逻辑封装成函数
check_ip_available,避免重复代码,也让脚本更易维护 - 可根据需要调整每次短睡眠的时长(比如改成5秒,对应循环120次),平衡检查频率和系统资源占用
>/dev/null 2>&1用于丢弃检查过程中产生的错误输出或冗余信息
方案二:后台睡眠+并行检查
让长睡眠在后台运行,同时前台持续检查IP状态,一旦发现不可用就杀死后台的睡眠进程,实现快速退出:
check_ip_available() { timeout 10 bash -c "</dev/tcp/$IP/5060" >/dev/null 2>&1 return $? } if check_ip_available; then echo "Primary DC is available..Proceeding to sleep with background checks" # 启动10分钟睡眠并记录进程ID sleep 600 & SLEEP_PID=$! # 持续检查IP状态,只要可用就继续循环 while check_ip_available; do sleep 10 # 检查间隔,可按需调整 done # IP不可用时,杀死后台睡眠进程 kill $SLEEP_PID 2>/dev/null echo "Primary DC is no longer available, exited sleep early" # 插入端口阻止代码 else echo "Primary DC is not available, executing port block immediately" # 插入端口阻止代码 fi
说明:
- 这种方式的响应速度更快,一旦IP不可用会立即终止睡眠(最多等待一次检查间隔的时间)
kill $SLEEP_PID 2>/dev/null用于忽略「睡眠进程已经自然结束」的错误提示
内容的提问来源于stack exchange,提问作者Asad Javed
相关产品推荐
相关产品推荐

