参考:

http://www.jb51.net/article/51720.htm

http://bbs.51cto.com/thread-1104907-1-1.html


原理:

通过管道 和文件操作符控制进程数。

通过curl访问百度首页,并对比在进程数不同的情况下执行完脚本所用时间来验证多进程。


1.代码

#!/bin/bash
#允许的进程数
THREAD_NUM=${2:-10}
#定义描述符为9的管道
mkfifo tmp
exec 9<>tmp
#预先写入指定数量的换行符,一个换行符代表一个进程
for ((i=0;i<$THREAD_NUM;i++))
do
    echo -ne "\n" 1>&9
done

if [ $# -lt 1 ] ;then
        echo "The parameters you enter is not correct !";
        exit -1;
fi

date
while read line
do
{
    #进程控制
    read -u 9
    {
        isok=`curl -I -o /dev/null -s -w %{http_code} $line`
        if [ "$isok" = "200" ]; then
            echo $line "OK"
        else
            echo $line "no"
        fi
        sleep 1
        echo -ne "\n" 1>&9
    }&
}
done < $1
wait
echo "执行结束"
date
rm tmp


其中第一个变量指定url列表,第二个变量为进程数。这里url内容为

http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com
http://www.baidu.com

执行过程及简要说明:

进程数为1时,耗时7秒
[root@ms234 test]# sh shell_multi_process.sh url.txt 1
Tue May  2 23:13:39 CST 2017
http://www.baidu.com OK
http://www.baidu.com OK
http://www.baidu.com OK
http://www.baidu.com OK
http://www.baidu.com OK
http://www.baidu.com OK
http://www.baidu.com OK
执行结束
Tue May  2 23:13:46 CST 2017

进程数为2时,耗时4秒
[root@ms234 test]# 
[root@ms234 test]# 
[root@ms234 test]# sh shell_multi_process.sh url.txt 2
Tue May  2 23:13:49 CST 2017
http://www.baidu.com OK
http://www.baidu.com OK
http://www.baidu.com OK
http://www.baidu.com OK
http://www.baidu.com OK
http://www.baidu.com OK
http://www.baidu.com OK
执行结束
Tue May  2 23:13:53 CST 2017
[root@ms234 test]# 
进程数为7时,耗时1秒
[root@ms234 test]# sh shell_multi_process.sh url.txt 7
Tue May  2 23:14:00 CST 2017
http://www.baidu.com OK
http://www.baidu.com OK
http://www.baidu.com OK
http://www.baidu.com OK
http://www.baidu.com OK
http://www.baidu.com OK
http://www.baidu.com OK
执行结束
Tue May  2 23:14:01 CST 2017