LinuxShell脚本并发执行_并发控制方案

2次阅读

shell并发控制可用wait+子shell实现轻量后台任务,配合flock加锁、parallel简化批量处理,并用timeout和trap保障超时清理与异常退出安全。

LinuxShell脚本并发执行_并发控制方案

用 wait + 子shell 实现基础并发控制

Shell 本身不支持原生线程,但可通过后台进程(&)启动多个任务,并用 wait 等待它们结束。这是最轻量、最通用的并发方式。

  • 每个任务用 (command) & 放入后台,避免阻塞主流程
  • 记录进程 ID($!)或直接用 wait 等待所有子进程
  • 若需限制并发数(如最多 5 个并行),配合 信号量式计数临时文件锁

用 flock 避免资源竞争

多个并发脚本可能同时读写同一文件或调用同一服务,flock 提供文件级排他锁,简单可靠。

  • flock /tmp/mylock -c "your_command":命令执行期间独占锁文件
  • 循环中对关键段加锁,例如日志写入、配置更新、数据库插入
  • 注意锁文件路径需全局一致且有写权限,推荐用绝对路径

gnu parallel 替代手写并发逻辑

当任务是“对一批数据分别执行相同命令”时,parallelwhile+& 更安全、更易控。

  • cat list.txt | parallel -j 4 "process {}":自动限制 4 路并发
  • 支持进度显示(--bar)、失败重试(--retries 2)、结果收集(--results dir/
  • 比纯 bash 方案更健壮,尤其处理含空格、换行符的参数时

用 timeout 和 trap 处理超时与异常退出

并发任务中某个子进程卡死或失控,会拖垮整个流程。必须设防。

  • timeout 30s command 为单个任务设硬性超时
  • 主脚本中用 trap 'kill $(jobs -p) 2>/dev/NULL' EXIT 确保异常退出时清理后台进程
  • 检查 $?wait -n(等待任一子进程结束)可实现“首个成功即返回”逻辑
text=ZqhQzanResources