基于文件计数器的Bash脚本多任务完成后自动关机实现问询
多脚本执行完成后自动关机的Bash实现方案
原脚本的问题
- 变量赋值语法错误:Bash里变量赋值不能带空格,算术运算得用
$(( ))或let命令,原脚本里的$n = $n + 1、$n = $n -1写法完全不符合规则 - 未同步计数器到文件:只通过
source读取了计数器,但修改后没写回文件,其他脚本拿不到最新的计数器值 - 无并发保护:多个脚本同时操作计数器文件时,会出现读写冲突,导致计数器数值不准
修正后的实现步骤
1. 初始化计数器文件
先创建计数器文件并把初始值设为0:
echo "n=0" > /home/user/bin/log/counter.txt
2. 修正后的脚本代码
#!/bin/bash # 定义计数器文件和锁文件的路径 COUNTER_FILE="/home/user/bin/log/counter.txt" LOCK_FILE="/home/user/bin/log/counter.lock" # 等待锁释放,避免多个脚本同时修改计数器 until mkdir "$LOCK_FILE" 2>/dev/null; do sleep 1 done # 读取当前计数器值 source "$COUNTER_FILE" # 计数器加1并写回文件 n=$((n + 1)) echo "n=$n" > "$COUNTER_FILE" # 释放锁 rmdir "$LOCK_FILE" # 执行你的业务操作(这里以backup为例) echo "backup" # 再次获取锁,更新计数器 until mkdir "$LOCK_FILE" 2>/dev/null; do sleep 1 done source "$COUNTER_FILE" n=$((n - 1)) echo "n=$n" > "$COUNTER_FILE" rmdir "$LOCK_FILE" # 判断是否触发关机 if [ "$n" -eq 0 ]; then echo "所有任务执行完毕,即将关机" shutdown -P now else echo "还有$n个任务在运行,不触发关机" exit 0 fi
核心说明
- 锁机制:用
mkdir创建锁目录(mkdir是原子操作,同一时间只有一个脚本能创建成功),避免多个脚本同时读写计数器导致数值错乱 - 变量操作规范:用
$(( ))做算术运算,赋值时不写空格,每次修改计数器后都同步回文件,保证其他脚本能读到最新值 - 流程逻辑:先递增计数器并保存,执行完业务操作后再递减计数器并保存,最后判断是否触发关机
内容的提问来源于stack exchange,提问作者acred
相关产品推荐
相关产品推荐

