Bash Shell脚本:使用xargs执行Shell函数的并行实例
我试图在shell脚本中使用xargs来运行在同一脚本中定义的函数的并行实例。该函数乘以页面的获取次数,因此在并行进程中而不是在后台进程中同时获取页面非常重要(如果我对这一点的理解是错误的,并且两者之间的差异可以忽略不计,请告诉我) 功能是:Bash Shell脚本:使用xargs执行Shell函数的并行实例,bash,shell,xargs,Bash,Shell,Xargs,我试图在shell脚本中使用xargs来运行在同一脚本中定义的函数的并行实例。该函数乘以页面的获取次数,因此在并行进程中而不是在后台进程中同时获取页面非常重要(如果我对这一点的理解是错误的,并且两者之间的差异可以忽略不计,请告诉我) 功能是: function time_a_url () { oneurltime=$($time_command -p wget -p $1 -O /dev/null 2>&1 1>/dev/null | grep real | cut
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\u a\u url作为参数?是的,我知道GNU parallel,我只是没有特权在我写这篇文章的地方安装软件。如果你在另一个系统上安装GNU parallel,你会看到功能在一个文件中(称为parallel)
您应该能够简单地将该文件复制到您自己的~/bin。下面是一个演示,演示如何让您的函数工作:
$ 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]
这项工作的关键是导出函数,以便生成的xargs
将看到它,并转义函数名和转义大括号之间的空格。你应该能够适应这种情况。您需要调整-P
和-n
的参数(或删除它们),以满足您的需要
您可能可以摆脱grep
和cut
。如果您使用的是Bash内置的time
,则可以使用TIMEFORMAT
变量指定输出格式。如果您使用的是GNU/usr/bin/time
,则可以使用--format
参数。这两个选项中的任何一个都允许您同时删除-p
您可以用-q
替换wget
命令的这一部分:2>&11>/dev/null
。在任何情况下,这些都是相反的。在Mac OS X上,正确的顺序应该是/dev/null 2>&1
:
xargs:max.进程数必须大于0(对于:xargs-p[>0])
我使用了
xargs-P0-n1-I{}bash-c“f{}”
,它仍然有效,而且看起来有点整洁。
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 '{}'