fix: 彻底修复 FIFO 清理问题(避免 trap 冲突)
## 问题根源 存在**两个 EXIT trap 冲突**: 1. `oci/create_instance.sh:364` - 清理 FIFO 的 trap 2. `common/remote_loader.sh:23` - 清理临时目录的 trap 在 Bash 中,每次设置新的 trap 会**覆盖**之前的 trap。 当 remote_loader.sh 加载时,它的 `trap cleanup_remote_libs EXIT` 会覆盖 main 函数中设置的 FIFO 清理 trap。 ## 错误表现 ``` /dev/fd/63: line 1: fifo: unbound variable ``` - FIFO 文件不会被清理(因为 trap 被覆盖) - Process substitution 退出时产生 trap 交互错误 ## 修复方案 **移除 trap,改用显式清理:** ```bash # 旧方案(有问题) trap "rm -f \"$fifo\"" EXIT configure_network "$ocid" "$fifo" & read subnet_id < "$fifo" # 新方案(可靠) configure_network "$ocid" "$fifo" & local bg_pid=$! # 保存后台进程 PID read subnet_id < "$fifo" # 读取结果 wait "$bg_pid" # 等待后台进程完成 rm -f "$fifo" # 手动清理 FIFO ``` ## 优势 - ✅ 避免 trap 冲突 - ✅ 显式的清理流程,更易理解 - ✅ 确保后台任务完成后再清理 - ✅ 与 remote_loader.sh 的 trap 兼容
This commit is contained in:
@@ -361,9 +361,18 @@ main() {
|
||||
local fifo
|
||||
fifo=$(mktemp -u)
|
||||
mkfifo "$fifo"
|
||||
trap "rm -f \"$fifo\"" EXIT
|
||||
|
||||
# 启动后台任务
|
||||
configure_network "$ocid" "$fifo" &
|
||||
local bg_pid=$!
|
||||
|
||||
# 读取结果
|
||||
read subnet_id < "$fifo"
|
||||
|
||||
# 等待后台任务完成并清理
|
||||
wait "$bg_pid"
|
||||
rm -f "$fifo"
|
||||
|
||||
log_success "网络配置完成 (子网ID: $subnet_id)"
|
||||
else
|
||||
log_info "使用指定的子网ID: $subnet_id"
|
||||
|
||||
Reference in New Issue
Block a user