shell oracle 多进程,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

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

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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27785870/viewspace-2214586/,如需转载,请注明出处,否则将追究法律责任。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值