bash:经理进程运行

时间:2018-02-22 10:22:12

标签: bash shell for-loop while-loop

我在$ 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

2 个答案:

答案 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