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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27785870/viewspace-2214586/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [SHELL] shell 實現多程式後,如何等待所有程式結束
- 自己動手實現 Shell 多程式管道符
- [Linux]簡單的shell實現Linux
- [轉]:多程式等待的跨平臺實現
- 【Linux】【Shell】主控指令碼實現Linux指令碼
- 用C語言實現簡易的shell程式,支援多重管道及重定向C語言
- [MAUI程式設計]介面多型與實現UI程式設計多型
- PHP實現master-worker守護多程式PHPAST
- 利用 Webpack 實現小程式多專案管理Web專案管理
- 你知道如何用 PHP 實現多程式嗎?PHP
- python多程式實現檔案海量複製Python
- 多選操作的實現
- 從0到1優雅的實現PHP多程式管理PHP
- jenkins + supervisor + ansible 實現netcore程式的多機一鍵部署JenkinsNetCore
- shell指令碼實現信用盤程式製作快速ping網段內的IP地址指令碼
- 以DevExpress開發的WinFrom程式的多語言功能的實現devExpress
- 模擬實現簡易版shell
- [ Shell ] 兩個 case 實現 GetOptions 效果
- shell指令碼實現DNS正向解析指令碼DNS
- 能用js實現的最終用js實現,Shell指令碼也不例外JS指令碼
- Swoole 中通過 process 模組實現多程式
- Laravel + Workerman 實現多程式定時器任務Laravel定時器
- 使用Java實現多執行緒程式設計Java執行緒程式設計
- 案例七:shell實現開機自動掛載本地YUM倉庫程式
- Python 3.6:多型的實現Python多型
- OGG刪除過期的trail檔案,shell實現AI
- shell指令碼實現多臺伺服器自動巡檢--可參考學習指令碼伺服器
- [shell]shell指令碼實現每天自動抽取資料插入hive表指令碼Hive
- Shell程式設計-09-Shell中的函式程式設計函式
- Shell程式設計 --- Shell介紹程式設計
- shell 和程式
- 通過 Swoole\Table 實現 Swoole 多程式資料共享
- 畫江湖之 PHP 多程式開發 [實現守護程式化]PHP
- Linux與Shell 第2天 實操、軟體包管理、Shell程式設計Linux程式設計
- linux的I/O重定向和管道的檔案描述符運用,及shell如何實現多執行緒?Linux執行緒
- Java多執行緒的實現Java執行緒
- shell指令碼實現---Zabbix5.0快速部署指令碼
- bash shell實現2048小遊戲詳解遊戲