我将如何使用 GNU Parallel 来执行这个 while 循环?

我将如何使用 GNU Parallel 来执行这个 while 循环?

所以我有一个 while 循环:

cat live_hosts | while read host; do \
    sortstuff.sh -a "$host" > sortedstuff-"$host"; done

但这可能需要很长时间。我将如何使用 GNU Parallel 来执行这个 while 循环?

答案1

您不使用 while 循环。

parallel "sortstuff.sh -a {} > sortedstuff-{}" <live_hosts

live_hosts请注意,如果您的(eg )中有路径,则这将不起作用,/some/dir/file因为它会扩展为sortstuff.sh -a /some/dir/file > sortedstuff-/some/dir/file(导致no such file or directory);对于这些情况,请使用{//}{/}(参见gnu-parallel手动的详情):

parallel "sortstuff.sh -a {} > {//}/sortedstuff-{/}" <live_hosts

答案2

作为一个老派的“做一件事并把它做好”的 Unix 人,我会将字符串替换内容放入包装脚本中:

#!/bin/sh
sortstuff.sh -a "$1" > sortedstuff-"$1"

如果你调用它wrapper.shparallel调用它的命令将是:

parallel wrapper.sh < live_hosts

请注意,您不需要cat这种事情,这样可以节省外部程序调用。

答案3

你不需要 parallel,因为循环体不依赖于先前的迭代。只需为每个主机启动一个新的后台进程即可。

while read host; do
    sortstuff.sh -a "$host" > sortedstuff-"$host" &
done < live_hosts
wait    # Optional, to block until the background tasks are done

parallel不过,确实可以更轻松地管理某些方面;您可以更轻松地限制并行运行的作业数量。

相关内容