在这个while循环中,我将如何使用GNU Parallel?


12

所以我有一个while循环:

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

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

Answers:


13

您不使用while循环。

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

请注意,如果您的路径live_hosts(例如/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

是否有可能使用teeparallel将输出到时sortedstuff?这样我就可以看到输出。
无产阶级2015年

1
@Proletariat-您也要输出到终端吗?只需替换为第一个命令>| tee例如 parallel "sortstuff.sh -a {} | tee sortedstuff-{}" <live_hosts
don_crissti

3

作为一个老派的“做一件事,做得很好”的Unix家伙,我将字符串替换内容放入包装脚本中:

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

如果您调用它wrapper.sh,则调用它的parallel命令将是:

parallel wrapper.sh < live_hosts

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


2

不需要 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确实可以更轻松地管理某些方面;您可以更轻松地限制并行运行的作业数量。


3
如果wc -l live_hosts大于磁盘主轴或CPU内核的数量(取决于任务是I / O还是CPU绑定的),您将吞噬通过这种解决方案从并行性中获得的很多好处。parallel如果您的目标是处理速度,那么限制作业数量的能力不仅不错,而且几乎是必不可少的。
沃伦·杨
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.