shell的多进程实现

建站服务器

方法总结:

    1. command & wait 方式

    2. 管道fifo

                   

    1.1

    实例1.1:将需要多进程执行的程序块全部使用command & wait 转移到后台执行即可。

          用“{}”将主执行程序变为一个块,用&放入后台,四次执行全部放入后台后,

          需要用一个wait指令,等待所有后台进程执行结束,

          不然系统是不会等待的,直接继续执行后续指令,直到整个程序结束。

    

     #!/bin/bash

     start=`date "%s"`

     for (( i=0; i<10; i ))

     do

         {

             echo "success!!!"

             sleep 3

         } &  #将上述程序块放到后台执行

     done

     wait    #等待上述程序结束

     end=`date "%s"`

     echo "time: " `expr $end – $start`

     

    

    2.1

    实例2.1:

    #!/bin/sh

    function a_sub {

        sleep 2;

        endtime=`date %s`

        sumtime=$[$endtime-$starttime]

        echo "我是whl,整个脚本已经执行了$sumtime秒"

    }

    

    starttime=`date %s`

    export starttime

    

    tmp_fifofile="/tmp/$$.fifo"               ##其中$$为该进程的pid

    

    mkfifo $tmp_fifofile                      ##创建命名管道

    

    exec 6<>$tmp_fifofile                     ##把文件描述符6和FIFO进行绑定

        

    rm -f $tmp_fifofile                       ##绑定后,该文件就可以删除了

        

    thread=30                                 ##

进程并发数为30,用这个数字来控制一次提交的请求数

    

    for ((i=0;i<$thread;i ));

    do    

        echo >&6                              ##写一个空行到管道里,因为管道文件的读取以行为单位

    done

    

    

    while read dat

    do

          ##读取管道中的一行,每次读取后,管道都会少一行

        read -u6

        {        a_sub || {echo "a_sub is failed"}

                   echo $dat

                   echo >&6                     ##每次执行完a_sub函数后,再增加一个空行,这样下面的进程才可以继续执行

        } &

    done<data.txt

    

    wait                                     ##这里的wait意思是,需要等待以上所有操作(包括后台的进程)都结束后,再往下执行。

       

    exec 6>&-                                ##关闭文件描述符6的写

    exec 6<&-

         

         

         

     

     实例2:多线程备份数据库

     

     #!/bin/bash

     hour=`date %H`

     day=`date %F`

     now=`date %F_%H`

     all_dbs="no"

     passwd="mysql_pass"

     sshpass="ssh_pass"

     dbs="db1 db2 db3 dbx dby dbz"

     

     cpu_num=`cat /proc/cpuinfo |grep processor|wc -l`

     p_fifo="/tmp/$$.pipo"

     mkfifo $p_fifo

     exec 111<>$p_fifo       #关联文件描述符和管道

     rm -f $p_fifo

     trap "exec 111>&-;exec 111<&-;exit 0" 2    

     for ((i=1; i<=$cpu_num; i ))

     do

         echo >&111             #定义进程队列大小,cpu核数

     done

     

     function backup()

     {

         if [ $all_dbs == "no" ];then

             for db in $dbs

             do

                 read -u111      #从队列中获取一个消息,队列中消息数减一

                 {

                 dbname=`echo $db|sed "s/-/@002d/g"`

                 ops="–parallel=5 –compress-threads=5 –databases=$dbname"

                 bpath="/data1/ehr-Mysql-backup/${day}/${db}"

                 inbackup

                 sleep 10

                 echo >&111  #添加一个消息到队列中,维持队列中消息数不变(进程个数)

                 } &               #将代码块放后台处理

             done

             wait                 #等待所有后台进程处理完

             exec 111>&-          #关闭描述符,写关闭

             exec 111<&-          #关闭描述符,读关闭

         else

             ops="–parallel=5 –compress-threads=5"

             bpath="/data1/ehr-MYSQL-backup/${day}"

             inbackup

         fi

     }

     

     function inbackup()

     {

         if [ -f ${bpath}/lsn_${last}/xtrabackup_checkpoints ];then

             echo "incremental_basedir found,do a increment backup"

            
/usr/bin/innobackupex -u root -p${passwd} –no-timestamp ${ops}
–incremental –incremental_basedir=${bpath}/lsn_${last}/
–extra-lsndir=${bpath}/lsn_${now}/ ${bpath} –stream=xbstream |gzip
|sshpass -p "${sshpass}" ssh -p 18122 root@10.10.10.79 "cat – >
${bpath}/${now}.xbstram.gz"

         else

             echo "incremental_basedir not found,do a full backup"

            
/usr/bin/innobackupex -u root -p${passwd} –no-timestamp ${ops}
–extra-lsndir=${bpath}/lsn_${now}/ ${bpath} –stream=tar |gzip |sshpass
-p "${sshpass}" ssh -p 18122 root@10.10.10.79 "cat – >
${bpath}/${now}.tgz"

         fi

     

     }

     

     case $hour in

     22)

             last=`date %F -d -yesterday`

             find /data1/ehr-mysql-backup/ -name "${last}*" -type d -exec rm -r "{}" \\\\;

             day=`date %F -d 1days`

             backup

             ;;

     10)

             last=`date %F_%H -d -12hours`

             backup

             ;;

     14|18)

             last=`date %F_%H -d -4hours`

             backup

             ;;

     *)

             echo "not backup time"

             ;;

     esac

          

         

更多关于云服务器域名注册虚拟主机的问题,请访问西部数码官网:www.west.cn

赞(0)
声明:本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-62778877-8306;邮箱:fanjiao@west.cn。本站原创内容未经允许不得转载,或转载时需注明出处:西部数码知识库 » shell的多进程实现

登录

找回密码

注册