bash - 多个 shell 脚本 worker

标签 bash shell

我们想要解释大量的坐标,并使用多个 worker 对它们进行处理。 我们得到了什么:

坐标.txt

100, 100, 100
244, 433, 233
553, 212, 432
776, 332, 223
...
8887887, 5545554, 2243234

worker.sh

coord_reader='^([0-9]+), ([0-9]+), ([0-9]+)$'
while IFS='' read -r line || [[ -n "$line" ]]; do
    if [[ $line =~ $coord_reader ]]; then

        x=${BASH_REMATCH[1]}
        y=${BASH_REMATCH[2]}
        z=${BASH_REMATCH[3]}
        echo "x is $x, y is $y, z is $z"
fi

done < "$1"

要执行 worker.sh,我们调用 bash worker.sh coords.txt

Bc 我们有数百万个坐标,需要拆分 coords.txt 并创建多个执行相同任务的工作人员,例如每个 coordsaa、coordsab、coordsac 1名 worker 。

所以我们使用split拆分coords.txt

split -l 1000 coords.txt coords

但是,如何为每个 worker 分配一个文件?

我是 stackoverflow 的新手,请随时发表评论,以便我提高提问技巧。

最佳答案

从 bash 运行 worker 来处理大量文件:

文件架构:

files/ runner.sh worker.sh 

files/ : 这是一个有很多文件的文件夹(例如1000个)
runner.sh: 启动一个worker
worker.sh 文件:处理一个文件的任务

例如:

worker.sh:

#!/usr/bin/env bash

sleep 5
echo $1

要运行 files/ 中的所有文件,每个 worker 执行一个:

runner.sh:

#!/usr/bin/env bash

n_processes=$(find files/ -type f | wc -l)
echo "spawning  ${n_processes}"

for file in $(find . -type f); then
    bash worker.sh "${file}" &
done

wait

/!\ 1000 processes is a lot !!

最好创建一个“进程池”(这里它只保证同时运行的进程的最大数量,旧的子进程不会被新任务重用,而是在其任务完成或失败时死亡):

#!/usr/bin/env bash

n_processes=8
echo "max of processes:  ${n_processes}"

for file in $(find files/ -type f); do
    while [[ $(jobs -r | wc -l) -gt ${n_processes} ]]; do
       :
    done
    bash worker.sh "${file}" &
    echo "process pid: $! finished"
done

wait

它不是真正的进程池,但它避免了同时存在大量进程,同时存在的最大进程数由 n_processes 给出。

执行bash runner.sh

关于bash - 多个 shell 脚本 worker ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44740137/

相关文章:

bash - 如何在 Makefile 目标中使用 Bash 语法?

linux - 在 linux 中搜索当前目录中名称不包含 "txt"的文件

bash - 如何在 shell 脚本中使用通配符连接字符串和变量

bash - "2<&1"重定向在 Bourne shell 中有什么作用?

shell - 将换行符转换为逗号

bash - 从每个参数中删除尾部斜杠的最简单方法是什么?

linux - Bash(或其他 shell ): wrap all commands with function/script

linux - 如何在 shell 中获取父目录名称的基本名称?

linux - Bash - if 语句结合邮件命令

bash - 在 bash 中获取像 200 这样的 Curl 返回代码