Rover12421's Blog

The End.

SVN批量CHECKOUT和COMMIT SELL脚本

        上篇贴的SVN批量CHECKOUT的shell脚本使用是没什么问题,但是伪多线程却又问题。这次新需求添加了COMMIT步骤,结构变化有点大,而且完善了伪多线程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/bin/bash
svnroot=svn
mkdir $svnroot
path=${PWD}

rm -rf tmp
mkdir tmp

file=saeAccount.txt
num=3

cat $file | while read line; do
        appname=`echo "$line" | awk '{print $1}'`
        user=`echo "$line" | awk '{print $2}'`
        pwd=`echo "$line" | awk '{print $3}'`
        svnpath=$svnroot/$appname
        #echo $svnpath 
        command="svn checkout https://svn.XXXX.com/$appname $svnpath --username $user --password $pwd --quiet --no-auth-cache"
        run=0
        while [[ $run == 0 ]]; do
                for ((i=0; i<$num; i++)); do
                        #echo "for--"$i 
                        if [ ! -f tmp/$i ]
                        then
                                #echo "file="$i 
                                echo $1 > tmp/$i
                                {
                                        cur=$i
                                        echo $command
                                        $command >> saeV2.log
                                        mkdir $svnpath/1
                                        cd $svnpath
                                        svn add 1
                    cd $path
                                        rm -f tmp/$cur
                                        #echo "rm="$cur 
                                } &
                                run=1
                                break;
                        fi
                done
                #echo sleep 1 
                sleep 1
        done
done
wait 
run=0
while [[ $run == 0 ]]; do
        for ((i=0; i<$num; i++)); do
                if [ -f tmp/$i ]
                then
                        run=0
                        sleep 1
                        echo "wait thread "$i" finish..."
                        break;
                else
                        run=1
                fi
        done
done
rm -rf tmp
echo "Task Termination!"

        简单的说下伪多线程。要实现多伪线程,实际上是利用了shell后台支持批量命令的方法。然后就是怎么防止无限制的后台进程数量执行。网上有很多例子,但是我用了我自己的方法,上次用了数组来做锁,今天测试的时候发现不行,好像是后台运行的命令块里的所有变量都是复制的,这样就导致了后台进程根本就修改不了前台shell里的变量。于是我换成了文件锁,一个进程就用一个文件来锁定,如果文件存在,说明进程存在,文件不存在,就可以再起一个后台进程。

Comments