我在$ tmpdir / $ i.dirlist中有多个文件,带有条目命令rsync。 每个文件(根据数量)有10个甚至150个rsync条目。
我现在想知道如何通过FOR或WHILE循环管理它,IF序列从每个文件运行($ tmpdir / $ i.dirlist - 如果我们有100个文件)只有2个条目并等待complet某些进程,如果rsync的所有正在运行的进程总数少于200个进程 - 启动新条目,维护参数中定义的固定数量的进程。在这种情况下200
有什么想法吗?怎么做?
编辑: 关于rsync条目。 在每个文件中,$ tmpdir / * .dirlist是(在本例中为200)条目目录
路径如:
==> /tmp/rsync.23611/0.dirlist <==
system/root/etc/ssl
system/root/etc/dbus-1
system/root/etc/lirc
system/root/etc/sysctl.d
==> /tmp/rsync.23611/1.dirlist <==
system/root/etc/binfmt.d
system/root/etc/cit
system/root/etc/gdb
==> /tmp/rsync.23611/2.dirlist <==
system/root/usr/local
system/root/usr/bin
system/root/usr/lib
现在运行它我只是用于
for i in $(seq 1 $rsyncs); do
while read r; do
rsync $rsyncopts backup@$host:$remotepath/$ri $r 2>&1 |
tee $tmpdir/$i.dirlist.log ;
done < $tmpdir/$i.dirlist &
done
答案 0 :(得分:0)
假设$ i的最大值为100,使用上面的代码仍然低于您希望允许200个进程的最大值。
因此解决方案是运行两倍的进程。我建议你将主循环for i in $(seq 1 2 $rsyncs); do ...
划分为两个并发运行的循环,由resp引入。 $i
的奇数值为for i in $(seq 2 2 $rsyncs); do ...
,$i
的偶数值为for i in $(seq 1 2 $rsyncs); do # i = 1 3 5 ...
while read r; do
rsync $rsyncopts backup@$host:$remotepath/$ri $r 2>&1 |
tee $tmpdir/$i.dirlist.log ;
done < $tmpdir/$i.dirlist &
done & # added an ampersand here
for i in $(seq 2 2 $rsyncs); do # i = 2 4 6 ...
while read r; do
rsync $rsyncopts backup@$host:$remotepath/$ri $r 2>&1 |
tee $tmpdir/$i.dirlist.log ;
done < $tmpdir/$i.dirlist &
done
。
processes=() # create an empty bash array
for i in $(sed 1 $rsyncs); do
while read r; do
# add the full rsync command line to the array
processes+=("rsync $rsyncopts backup@$host:$remotepath/$ri $r 2>&1 | tee $tmpdir/$i.dirlist.log");
done < $tmpdir/$i.dirlist
done
修改:由于我的上述方法无法说服您,让我们尝试完全不同的方法。首先,创建一个要运行的所有进程的列表,并将它们存储在一个数组中:
for ((j=0;j<200;j++)); do
$processes[$j]& # launch processes in background
done
while [ ! -z "$processes[$j]" ] ; do
wait # wait one process finishes
$processes[((j++))]& # launch one more process
done
获得该数组后,启动200个进程,然后输入一个循环以等待进程完成并启动下一个进程:
from statsmodels.tsa.api import ExponentialSmoothing, SimpleExpSmoothing, Holt
请试试并告诉我们。
答案 1 :(得分:0)
以使用示例
for ARG in $*; do
command $ARG &
NPROC=$(($NPROC+1))
if [ "$NPROC" -ge 4 ]; then
wait
NPROC=0
fi
done