Unix:并行运行进程:仅限2个实例

时间:2014-11-25 18:31:33

标签: shell unix scripting

我的/tmp目录可以包含数百个文件。我想将它们转移到另一台服务器,但只应运行两个FTP实例。

我创建了一个FTP脚本,它将输入变量作为文件名并启动trfr进程。

主脚本:创建列表文件的过程,然后创建两个变量var1var 2,前两个文件名。

我创建了一个while循环并运行ksh ftp.sh var1 & ksh ftp.sh var2

问题:

如果var1作业正在运行,我无法再次运行var2,因为命令不会出现在while循环中。

2 个答案:

答案 0 :(得分:2)

考虑使用GNU Parallel,如下所示:

cd /tmp
parallel -j 2 trfr {} ::: *

-j 2一次只运行两个,所有文件名都在:::之后给出。如果这会溢出您的命令行,您可以使用findls,如下所示:

cd /tmp
find . -print0 | parallel -0 -j 2 trfr {}

答案 1 :(得分:1)

您也可以这样做。首先生成所有文件的列表并按大小对其进行排序,以便每个FTP进程发送类似大小的文件,一个不比另一个长,然后启动两个FTP并等待两个完成直到所有文件都已转移。

#!/bin/bash

cd /tmp

# Generate list of all files sorted into increasing size
du * | sort -n | cut -f 2- | \
    while :; do
       read f
       [ $? -eq 1 ] && break
       echo $f
       trfr "$f" &
       read f
       [ $? -eq 1 ] && break
       echo $f
       trfr "$f" &
       wait           # for both transfers to finish
    done