猛击“ps”并行进程并检查它们何时完成

时间:2012-01-26 17:08:41

标签: linux bash shell

我需要浏览大量文件,我在这样的bash脚本中执行此操作:

#! /usr/bin/env bash

REX="word"
grep -IP $REX A* >> result &
grep -IP $REX B* >> result &
grep -IP $REX C* >> result &
grep -IP $REX D* >> result &
[..]

如何知道所有流程何时完成?

4 个答案:

答案 0 :(得分:4)

使用bash内置'wait'

  

等[n ...]

     

等待每个指定的进程并返回其终止状态。每个n可以是进程ID或作业规范;如果给出了作业规范,则等待该作业管道中的所有进程。如果未给出n,则等待所有当前活动的子进程,并且返回状态为零。如果n指定不存在的进程或作业,则返回状态为127.否则,返回状态是最后一个进程或作业等待的退出状态。

在你的情况下,它应该足够了:

REX="word"
grep -IP $REX A* >> result &
grep -IP $REX B* >> result &
grep -IP $REX C* >> result &
grep -IP $REX D* >> result &

echo "Waiting..."
wait
echo "All child terminated"

答案 1 :(得分:4)

我会以不同的方式解决你的问题。 find可以在文件系统上找到特定文件,xargs允许您在给定的输入文件上运行命令。所以我会使用这样的命令:

find ./ -type f -print0 | xargs -0 -I{} -n1 -P4 grep -IP $REX '{}' >> result

这将从当前目录(./)开始搜索所有常规文件(-type f),并将它们安全地传递给xargs以防万一中存在任何空格文件名(-print0)。 xargs然后,对于每个命令,运行grep命令。 -I{}告诉xargs它看到{}的位置会将文件名插入到命令中。这里不是绝对必要的,但是很好的做法。 -0与来自-print0的{​​{1}}齐头并进,并告诉它期望以这种方式输入。 find告诉-P4同时运行最多4个进程,并且xargs,如手册页所述,提示-n1仅使用一个参数每个命令的时间。

你可以在这里进行各种调整,无论是不想搜索所有文件,还是只想进入certian深度,但是这个通用命令应该让你开始执行这类任务。

答案 2 :(得分:1)

尝试检查jobs -p | wc -l的输出是否为零行。

仅供参考:与使用shell作为职位经理相比,有更好的方法进行并行处理。 find -print0xargs -0 -P是我个人的最爱。

答案 3 :(得分:0)

使用等待。在这种情况下,我甚至认为你不需要保存和指定pids,例如

    #! /usr/bin/env bash

REX="word"
grep -IP $REX A* >> result &
grep -IP $REX B* >> result &
grep -IP $REX C* >> result &
grep -IP $REX D* >> result &
[..]
wait
echo "done"

请注意,除了列出所有内容之外,还有更好的方法。例如,您可以将ls传递给xargs,或者将exec与find一起使用。