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

如何让BASH Dialog的tailbox在脚本结束后自动延迟关闭?

解决Dialog Tailbox自动关闭问题

核心思路

通过监控initRPI后台进程的状态,在硬件初始化完成后延迟2秒,自动关闭tailbox对话框,无需用户手动操作。

修改后的代码实现

1. 更新initRPI函数(添加关闭提示)

function initRPI { # Wait for carrier Board to be plugged in, then initialize CM Unit
    echo -e "Plug in carrier board with compute module attached.\n"
    pkill "rpiboot"
    sleep 0.5
    $FILE # Run rpiboot from where it's installed
    # 添加加粗的关闭提示,让用户明确知晓对话框即将自动关闭
    echo -e "\n\033[1mCompute Module Initialized - Closing in 2 seconds...\033[0m"
}

2. 修改writeImage函数(添加进程监控与自动关闭逻辑)

function writeImage { # Find proper image and write it to device
    if [[ " ${boxTypes[*]} " =~ "$boxType" ]]; then
        # 启动initRPI后台进程并记录其PID
        initRPI > _temp &
        init_pid=$!

        # 启动tailbox对话框后台运行,同时记录对话框PID,保留60秒超时兜底
        dialog --backtitle "$backTitle" --fb --title "Image Writer" --timeout 60 --tailbox _temp 15 70 &
        dialog_pid=$!

        # 等待硬件初始化进程完成
        wait $init_pid

        # 延迟2秒,给用户足够时间查看完成提示
        sleep 2

        # 自动关闭对话框,忽略进程已退出的错误信息
        kill $dialog_pid 2>/dev/null

        # 后续原有逻辑保持不变
        if pgrep -f rpiboot &> /dev/null 2>&1; then
            pkill "rpiboot"
            dialogMsg FAILED "Compute Module was not initialized."
        else
            devCM="/dev/sda"
            if [ ! -d "/mnt/firmware" ]; then
                mkdir /mnt/firmware
            fi
            mount -t nfs $nasIP/firmware /mnt/firmware
            (pv -n "/mnt/firmware/${unitSerial:2:4}.img" | dd of="$devCM" bs=4M conv=notrunc,noerror) 2>&1 | dialog --gauge "Running cloning $imageName to device $1, please wait..." 10 70 0
            sleep 0.5
            if kill -0 "$pid" ; then
                dialogMsg SUCCESS "Image $imageName written to device $1."
            else
                dialogMsg FAILED "Image $imageName failed to write to device $1."
            fi
        fi
    else
        dialogMsg ERROR "Can't find $boxType in the model list."
    fi
}

关键修改点说明

  • 记录进程PID:分别记录initRPI和dialog的进程ID,确保能精准控制流程
  • 后台运行对话框:将dialog改为后台执行,让脚本可以同时监控初始化进程状态
  • 等待初始化完成:使用wait $init_pid阻塞脚本,直到硬件初始化流程结束
  • 延迟自动关闭:sleep 2给用户预留查看提示的时间,随后通过kill命令关闭对话框
  • 错误兼容:kill命令后添加2>/dev/null,避免因对话框已超时退出而抛出错误

内容的提问来源于stack exchange,提问作者Kevitto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:16:15