建站服務(wù)器
方法總結(jié):
1. command & + wait 方式
2. 管道fifo
1.1
實(shí)例1.1:將需要多進(jìn)程執(zhí)行的程序塊全部使用command & wait 轉(zhuǎn)移到后臺(tái)執(zhí)行即可。
用“{}”將主執(zhí)行程序變?yōu)橐粋€(gè)塊,用&放入后臺(tái),四次執(zhí)行全部放入后臺(tái)后,
需要用一個(gè)wait指令,等待所有后臺(tái)進(jìn)程執(zhí)行結(jié)束,
不然系統(tǒng)是不會(huì)等待的,直接繼續(xù)執(zhí)行后續(xù)指令,直到整個(gè)程序結(jié)束。
#!/bin/bash
start=`date +"%s"`
for (( i=0; i<10; i++ ))
do
{
echo "success!!!"
sleep 3
} & #將上述程序塊放到后臺(tái)執(zhí)行
done
wait #等待上述程序結(jié)束
end=`date +"%s"`
echo "time: " `expr $end - $start`
2.1
實(shí)例2.1:
#!/bin/sh
function a_sub {
sleep 2;
endtime=`date +%s`
sumtime=$[$endtime-$starttime]
echo "我是whl,整個(gè)腳本已經(jīng)執(zhí)行了$sumtime秒"
}
starttime=`date +%s`
export starttime
tmp_fifofile="/tmp/$$.fifo" ##其中$$為該進(jìn)程的pid
mkfifo $tmp_fifofile ##創(chuàng)建命名管道
exec 6<>$tmp_fifofile ##把文件描述符6和FIFO進(jìn)行綁定
rm -f $tmp_fifofile ##綁定后,該文件就可以刪除了
thread=30 ##
進(jìn)程并發(fā)數(shù)為30,用這個(gè)數(shù)字來控制一次提交的請(qǐng)求數(shù)
for ((i=0;i<$thread;i++));
do
echo >&6 ##寫一個(gè)空行到管道里,因?yàn)楣艿牢募淖x取以行為單位
done
while read dat
do
##讀取管道中的一行,每次讀取后,管道都會(huì)少一行
read -u6
{ a_sub || {echo "a_sub is failed"}
echo $dat
echo >&6 ##每次執(zhí)行完a_sub函數(shù)后,再增加一個(gè)空行,這樣下面的進(jìn)程才可以繼續(xù)執(zhí)行
} &
done<data.txt
wait ##這里的wait意思是,需要等待以上所有操作(包括后臺(tái)的進(jìn)程)都結(jié)束后,再往下執(zhí)行。
exec 6>&- ##關(guān)閉文件描述符6的寫
exec 6<&-
實(shí)例2:多線程備份數(shù)據(jù)庫
#!/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 #關(guān)聯(lián)文件描述符和管道
rm -f $p_fifo
trap "exec 111>&-;exec 111<&-;exit 0" 2
for ((i=1; i<=$cpu_num; i++))
do
echo >&111 #定義進(jìn)程隊(duì)列大小,cpu核數(shù)
done
function backup()
{
if [ $all_dbs == "no" ];then
for db in $dbs
do
read -u111 #從隊(duì)列中獲取一個(gè)消息,隊(duì)列中消息數(shù)減一
{
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 #添加一個(gè)消息到隊(duì)列中,維持隊(duì)列中消息數(shù)不變(進(jìn)程個(gè)數(shù))
} & #將代碼塊放后臺(tái)處理
done
wait #等待所有后臺(tái)進(jìn)程處理完
exec 111>&- #關(guān)閉描述符,寫關(guān)閉
exec 111<&- #關(guān)閉描述符,讀關(guān)閉
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
本文標(biāo)題:shell的多進(jìn)程實(shí)現(xiàn)
文章分享:http://sd-ha.com/article14/cjsdge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站排名、網(wǎng)站營銷、網(wǎng)站建設(shè)、外貿(mào)建站、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)