Linux 为什么';等等';不';不要等待分离的工作
我随后通过拆分一个大文件、排序和合并来并行排序。 这些步骤是:Linux 为什么';等等';不';不要等待分离的工作,linux,bash,sorting,Linux,Bash,Sorting,我随后通过拆分一个大文件、排序和合并来并行排序。 这些步骤是: split-l50000data.tsv'\u tmp' ls-1 tmp*|读取文件时;对$FILE进行排序-o$FILE&done sort-m\u tmp*-o data.tsv.sorted 在步骤2和步骤3之间,必须等待排序步骤完成。 我认为不带任何参数的wait是正确的,因为根据man页面,如果在不带参数的情况下调用wait,则会等待所有当前活动的子进程 但是,当我在shell中尝试此操作时(即执行步骤1和2,然后执行w
split-l50000data.tsv'\u tmp'
ls-1 tmp*|读取文件时;对$FILE进行排序-o$FILE&done
sort-m\u tmp*-o data.tsv.sorted
wait
是正确的,因为根据man
页面,如果在不带参数的情况下调用wait
,则会等待所有当前活动的子进程
但是,当我在shell中尝试此操作时(即执行步骤1和2,然后执行wait
),wait
立即返回,尽管top
显示排序进程仍在运行
最终,我想用它来提高脚本的速度,所以这不是我可以在shell上手动完成的一件事
我知道自版本8以来,sort
有一个--parallel
选项,但是在我运行此选项的集群上,安装了一个较旧的版本,我还想知道如何解决此问题。来自:
管道中的每个命令都作为单独的进程执行(即,在子shell中)
因此,当您通过管道连接到而时,将创建一个子shell。步骤2中的所有其他内容都在这个子shell中执行(即,所有后台进程)。然后脚本退出while循环,离开子shell,并在父shell中执行wait
,在父shell中无需等待任何内容。您可以使用以下方法避免使用管道:
读取文件时;做
排序$FILE-o$FILE&
已完成<来自:
管道中的每个命令都作为单独的进程执行(即,在子shell中)
因此,当您通过管道连接到而时,将创建一个子shell。步骤2中的所有其他内容都在这个子shell中执行(即,所有后台进程)。然后脚本退出while循环,离开子shell,并在父shell中执行wait
,在父shell中无需等待任何内容。您可以使用以下方法避免使用管道:
读取文件时;做
排序$FILE-o$FILE&
完成<下面是一个简单的测试用例,再现了您的问题:
true | { sleep 10 & }
wait
echo "This echos immediately"
问题是管道创建了一个子shell,而分叉的进程是该子shell的一部分。解决方案是在子shell中等待,而不是在主父shell中等待:
true | { sleep 10 & wait }
echo "This waits"
翻译回您的代码,这意味着:
ls -1 _tmp* | { while read FILE; do sort $FILE -o $FILE & done; wait; }
下面是一个简单的测试用例,再现了您的问题:
true | { sleep 10 & }
wait
echo "This echos immediately"
问题是管道创建了一个子shell,而分叉的进程是该子shell的一部分。解决方案是在子shell中等待,而不是在主父shell中等待:
true | { sleep 10 & wait }
echo "This waits"
翻译回您的代码,这意味着:
ls -1 _tmp* | { while read FILE; do sort $FILE -o $FILE & done; wait; }
ls…|读取文件时
出错。对_tmp*中的文件使用;改为做
。ls…|读取文件时
出错。对_tmp*中的文件使用;改为执行
。