12

我正在尝试在 shell 脚本中使用 xargs 来运行我在同一脚本中定义的函数的并行实例。该函数对页面的获取进行计时,因此重要的是页面实际上是在并行进程中同时获取的,而不是在后台进程中(如果我对此的理解是错误的并且两者之间的差异可以忽略不计,请告诉我) .

功能是:

function time_a_url ()
{
     oneurltime=$($time_command -p wget -p $1 -O /dev/null 2>&1 1>/dev/null | grep real | cut -d" " -f2)
     echo "Fetching $1 took $oneurltime seconds."
}

如何使用 xargs 管道以一种可能需要多次并行运行 time_a_url 作为参数的形式来做到这一点?是的,我知道 GNU 并行,我只是没有权限在我写这篇文章的地方安装软件。

4

3 回答 3

12

这是一个演示如何让你的函数工作:

$ f() { echo "[$@]"; }
$ export -f f
$ echo -e "b 1\nc 2\nd 3 4" | xargs -P 0 -n 1 -I{} bash -c f\ \{\}
[b 1]
[d 3 4]
[c 2]

完成这项工作的关键是export函数,因此生成的bashxargs看到它并转义函数名称和转义大括号之间的空格。您应该能够调整它以适应您的情况。您需要调整参数-P-n(或删除它们)以满足您的需要。

您可能可以摆脱grepand cut。如果您使用 Bash 内置,您可以使用变量time指定输出格式。TIMEFORMAT如果您使用的是 GNU /usr/bin/time,则可以使用该--format参数。这些中的任何一个都可以让你放弃-p

您可以将这部分wget命令2>&1 1>/dev/null替换为-q:在任何情况下,你都把它们颠倒过来了。正确的顺序是>/dev/null 2>&1.

于 2010-07-23T23:03:19.273 回答
1

在 Mac OS X 上:

xargs:最大。进程必须>0(对于:xargs -P [>0])

f() { echo "[$@]"; }
export -f f

echo -e "b 1\nc 2\nd 3 4" | sed 's/ /\\ /g' | xargs -P 10 -n 1 -I{} bash -c f\ \{\}

echo -e "b 1\nc 2\nd 3 4" | xargs -P 10 -I '{}' bash -c 'f "$@"' arg0 '{}'
于 2010-07-24T15:21:53.380 回答
0

如果您在另一个系统上安装 GNU Parallel,您将看到该功能位于单个文件中(称为并行)。

您应该能够简单地将该文件复制到您自己的 ~/bin。

于 2010-07-23T21:43:19.647 回答