Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 多个shell脚本工作程序_Bash_Shell - Fatal编程技术网

Bash 多个shell脚本工作程序

Bash 多个shell脚本工作程序,bash,shell,Bash,Shell,我们想解释成吨的坐标,并使用多个工作人员来处理它们。 我们得到了什么: files/ runner.sh worker.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 coord

我们想解释成吨的坐标,并使用多个工作人员来处理它们。 我们得到了什么:

files/ runner.sh worker.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
coords.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"
但是,如何为每个工作人员分配一个文件


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

要运行bash中的工作人员来处理大量文件,请执行以下操作:

文件体系结构:

files/ runner.sh worker.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个)
runner.sh
:启动大量工作人员
worker.sh文件
:处理文件的任务

例如:

工人。sh

#!/usr/bin/env bash

sleep 5
echo $1
要运行
files/
中的所有文件,请执行以下操作:

runner.sh:

files/ runner.sh worker.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道工序太多了

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

它实际上不是一个进程池,但它避免了同时有许多进程处于活动状态,同时活动的最大进程数由
n\u进程
给出


执行
bash runner.sh

我会使用GNU Parallel来执行。假设您希望一次运行8个工人,直到所有处理完成:

parallel -j 8 --pipepart -a coords.txt --fifo bash worker.sh {}
其中:

  • -j8表示“一次运行8个作业”
  • --pipepart表示“将输入文件拆分为多个部分”
  • -coords.txt表示“这是输入文件”
  • --fifo的意思是“创建一个临时fifo将数据发送到,并将其名称保存在
    {}
    中以传递给您的工作脚本”

只需循环文件名,将文件名作为命令行参数传递给每个工作人员。我不知道每个确切的文件名。那么,如何做到这一点呢?Thx,但是
echo
命令仅用于演示:)请看一看。bash是完成此任务的正确工具吗?您是否考虑过更合适的工具,例如Python或Perl?您知道如何做到这一点吗<代码>/!\1000个进程太多了,最好创建一个进程池u限制进程的想法非常好:)我来试试!我得到以下语法错误:
意外标记附近的语法错误
do'I将详细说明解决方案;)让我们。