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

基于文件计数器的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:05:52