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

用 wait + 子shell 实现基础并发控制
Shell 本身不支持原生线程,但可通过后台进程(&)启动多个任务,并用 wait 等待它们结束。这是最轻量、最通用的并发方式。
- 每个任务用
(command) &放入后台,避免阻塞主流程 - 记录进程 ID(
$!)或直接用wait等待所有子进程 - 若需限制并发数(如最多 5 个并行),配合 信号量式计数 或 临时文件锁
用 flock 避免资源竞争
多个并发脚本可能同时读写同一文件或调用同一服务,flock 提供文件级排他锁,简单可靠。
-
flock /tmp/mylock -c "your_command":命令执行期间独占锁文件 - 在循环中对关键段加锁,例如日志写入、配置更新、数据库插入
- 注意锁文件路径需全局一致且有写权限,推荐用绝对路径
用 gnu parallel 替代手写并发逻辑
当任务是“对一批数据分别执行相同命令”时,parallel 比 while+& 更安全、更易控。
-
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(等待任一子进程结束)可实现“首个成功即返回”逻辑