Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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
Linux 为什么';等等';不';不要等待分离的工作_Linux_Bash_Sorting - Fatal编程技术网

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
  • 在步骤2和步骤3之间,必须等待排序步骤完成。 我认为不带任何参数的
    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*中的文件使用
    ;改为执行