bash命令并行处理和多线程运行——筑梦之路

1. & 符号连接

task1  &   task2  &  task3  &   wait

并行运行三个任务并等待所有任务完成, 建议使用绝对路径

2. 带后台作业的循环

for i in {1..5}; do
  some_command "$i" || echo "Job $i failed" &
done
wait


3. 手动限制并行作业数

max=3
for i in {1..10}; do
  some_task "$i" &
  while (( $(jobs -rp | wc -l) >= max )); do
    sleep 0.5
  done
done
wait

每次处理3个作业,等待后继续手动节流

4. 使用 xargs -P 实现并行执行

xargs -n 1 -P 5 curl -O < urls.txt

使用5个并行curl进程从 urls.txt 下载文件

5. 并行文件处理

find . -maxdepth 1 -name "*.log" -print0 | xargs -0 -n 1 -P 4 gzip

使用4个并行进程压缩.log文件

6. 并行SSH连接多台主机

xargs -n 1 -P 10 -I{} ssh -o ConnectTimeout=5 user@{} "uptime" < servers.txt

并行获取多台服务器的uptime(最多10台同时),-o ConnectTimeout=5 防止连接挂起

7. 并行测试执行

find tests/ -name "*.sh" -print0 | xargs -0 -n 1 -P 4 bash

并行运行基于shell的测试脚本,非常适合CI流水线

8. 后台函数执行

worker() { echo "Task $1"; sleep 2; echo "Done $1"; }
for i in {1..4}; do worker "$i" & done
wait

以模块化方式并行运行逻辑,并行运行 worker 函数4次

9. 并行运行 worker 函数4次

xargs -n 1 -P 5 -I{} rsync -az /data/ user@{}:/backup/ < hosts.txt

同时将 /data/ 同步到多台主机

10. 使用GNU parallel

parallel -j 6 "echo Processing {}; sleep 2" < list.txt

每次运行6个作业
parallel 处理引用、批处理等
需要先安装(sudo apt install parallel)

11. 使用GNU parallel并行curl

parallel -j 8 "curl --retry 3 -O {}" < urls.txt

使用最多8个并发curl进程下载文件(包含重试)

12. 并行端口扫描

for ip in $(seq 1 10); do
  (nc -zv -w2 192.168.1.$ip 22 && echo "SSH open on $ip") &
done
wait

同时检查10台主机的SSH端口22

13. 使用作业队列(命名管道)节流作业

mkfifo pipe; exec 3<>pipe
for i in {1..4}; doecho >&3; done

for job in {1..10}; do
read -u 3
  {
    echo"Starting job $job"
    sleep 2
    echo"Finished job $job"
    echo >&3
  } &
done

wait
exec 3>&-

使用命名管道(类似信号量)的高级节流模式
设置 {1..N} 为所需的并发级别

14. 监控并行后台作业

for i in {1..5}; do
  (echo "Running $i"; sleep $((RANDOM % 5 + 1)); echo "Done $i") &
done

while jobs | grep -q .; do
  echo "Waiting for jobs to complete..."
  sleep 1
done

循环监控作业而非仅依赖wait
比 wait 更详细,适合实时监控

15. 使用Bash数组跟踪作业

pids=()
for file in *.log; do
  gzip "$file" &
  pids+=($!)
done

for pid in "${pids[@]}"; do
  wait "$pid" || echo "Job $pid failed"
done

使用数组跟踪作业PID以便后续处理或选择性等待


注意事项:

CPU/内存限制:不要使系统过载,合理使用节流
竞态条件:多个进程写入同一文件时要小心
调试:后台作业使错误跟踪更困难
错误处理:使用 wait $PID || echo "Job failed" 模式跟踪失败
专业提示:并行运行任务时,确保每个任务都是幂等的,即可以多次运行而不会产生意外副作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值