我的/tmp
目录可以包含数百个文件。我想将它们转移到另一台服务器,但只应运行两个FTP实例。
我创建了一个FTP脚本,它将输入变量作为文件名并启动trfr
进程。
主脚本:创建列表文件的过程,然后创建两个变量var1
和var 2
,前两个文件名。
我创建了一个while循环并运行ksh ftp.sh var1 & ksh ftp.sh var2
问题:
如果var1
作业正在运行,我无法再次运行var2
,因为命令不会出现在while循环中。
答案 0 :(得分:2)
考虑使用GNU Parallel,如下所示:
cd /tmp
parallel -j 2 trfr {} ::: *
-j 2
一次只运行两个,所有文件名都在:::
之后给出。如果这会溢出您的命令行,您可以使用find
或ls
,如下所示:
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