首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BASH -在传输后传输大文件和进程,限制进程的数量。

BASH -在传输后传输大文件和进程,限制进程的数量。
EN

Stack Overflow用户
提问于 2018-07-17 19:33:21
回答 1查看 45关注 0票数 2

我有几个大文件,我需要传送到本地机器和进程。传输所需的时间与文件的处理时间一样长,并且我希望在它传输之后立即开始处理它。但是处理过程可能比传输时间更长,我不希望进程不断积累,但我想将其限制在一些数字上,比如4。

请考虑以下几点:

代码语言:javascript
复制
LIST_OF_LARGE_FILES="file1 file2 file3 file4 ... fileN"
for FILE in $LIST_OF_LARGE_FILES; do
    scp user@host:$FILE ./
    myCommand $FILE &
done

这将传输每个文件,并在传输之后开始处理它,同时允许下一个文件开始传输。但是,如果myCommand $FILE传输一个文件所需的时间要长得多,这些文件就会不断堆积,使本地机器陷入泥潭。所以我想把myCommand限制在2-4个并行实例上。随后调用myCommand的尝试应该对其进行缓冲,直到打开“时隙”为止。在BASH中是否有一个很好的方法来做到这一点(使用xargs或其他实用程序是可以接受的)。

更新:感谢您在这方面提供的帮助。现在,我正在尝试实现以下逻辑:

代码语言:javascript
复制
LIST_OF_LARGE_FILES="file1 file2 file3 file4 ... fileN"
for FILE in $LIST_OF_LARGE_FILES; do
    echo "Starting on $FILE"  # should go to terminal output
    scp user@host:$FILE ./
    echo "Processing $FILE"   # should go to terminal output
    echo $FILE                # should go through pipe to parallel
done | parallel myCommand
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-17 20:51:27

为此,您可以使用GNU并行。只需回显您想要运行到parallel中的命令,它将在您的计算机的每个CPU核心上运行一个作业。

代码语言:javascript
复制
for f in ... ; do
   scp ...
   echo ./process "$f"
done | parallel

如果您一次需要4个进程,请使用parallel -j 4

如果您想要进度条,请使用parallel --bar

或者,仅用null终止回显文件名,并将处理命令添加到parallel调用中。

代码语言:javascript
复制
for f in ... ; do
   scp ...
   printf "%s\0" "$f"
done | parallel -0 -j4 ./process 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51388976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档