You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 20:37:29