建站服务器
方法总结:
 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
 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
 

新闻名称:shell的多进程实现
文章路径:http://www.scyingshan.cn/article/cjsdge.html

 建站
建站
 咨询
咨询 售后
售后
 建站咨询
建站咨询 
 