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

创新互联服务项目包括金东网站建设、金东网站制作、金东网页制作以及金东网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,金东网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到金东省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

本文标题:shell的多进程实现
文章分享:https://www.cdcxhl.com/article14/cjsdge.html

成都网站建设公司_创新互联,为您提供外贸网站建设网站排名网站营销网站建设外贸建站商城网站

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

网站建设网站维护公司