Shell多線程操作及線程數(shù)控制實(shí)例
前言
在業(yè)務(wù)開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)在后臺(tái)寫(xiě)一些shell腳本處理數(shù)據(jù),但估計(jì)很多人不知道shell腳本也可以支持多線程,而且非常簡(jiǎn)單。本篇文章主要就是介紹shell實(shí)現(xiàn)多進(jìn)程以及進(jìn)程數(shù)量控制。
需求
為了更好的說(shuō)明問(wèn)題,我們結(jié)合例子講解,假設(shè)需求就是掃描url.txt文件,然后判斷里面的URL是否失效。url.txt文件的內(nèi)容是一行一個(gè)URL,如:
http://www.baidu.com
http://www.google.com
http://www.dbjr.com.cn
單進(jìn)程實(shí)現(xiàn)
那么shell腳本scanUrl.sh可以這樣寫(xiě):
#!/bin/bash
#判斷是否有參數(shù)
if [ $# != 1 ] ;then
echo "The parameters you enter is not correct !";
exit -1;
fi
#循環(huán)讀出URL并判斷狀態(tài)碼
while read line
do
{
isok=`curl -I -o /dev/null -s -w %{http_code} $line`
if [ "$isok" = "200" ]; then
echo $line "OK"
else
echo $line "no"
fi
}
done < $1
echo "執(zhí)行結(jié)束"
那么可以執(zhí)行下面的命令掃描:
/bin/sh scanUrl.sh url.txt
但這樣腳本執(zhí)行非常慢,一萬(wàn)個(gè)URL幾個(gè)小時(shí)都掃描不完。
多進(jìn)程實(shí)現(xiàn)
改成多進(jìn)程實(shí)現(xiàn)非常簡(jiǎn)單,只需要在do后面的大括號(hào)加 & 符號(hào),在done后面加一個(gè)wait,表示父進(jìn)程等待子進(jìn)程退出后再退出
#!/bin/bash
#判斷是否有參數(shù)
if [ $# != 1 ] ;then
echo "The parameters you enter is not correct !";
exit -1;
fi
#循環(huán)讀出URL并判斷狀態(tài)碼
while read line
do
{
isok=`curl -I -o /dev/null -s -w %{http_code} $line`
if [ "$isok" = "200" ]; then
echo $line "OK"
else
echo $line "no"
fi
}
}&
done < $1
wait
echo "執(zhí)行結(jié)束"
這樣就能多進(jìn)程并發(fā)執(zhí)行了,但有個(gè)問(wèn)題是進(jìn)程會(huì)一下子非常多,幾百上千,超過(guò)系統(tǒng)限制報(bào)錯(cuò),下面我們就加上進(jìn)程數(shù)控制。
多進(jìn)程實(shí)現(xiàn)并控制進(jìn)程數(shù)
#!/bin/bash
#允許的進(jìn)程數(shù)
THREAD_NUM=200
#定義描述符為9的管道
mkfifo tmp
exec 9<>tmp
#預(yù)先寫(xiě)入指定數(shù)量的換行符,一個(gè)換行符代表一個(gè)進(jìn)程
for ((i=0;i<$THREAD_NUM;i++))
do
echo -ne "\n" 1>&9
done
if [ $# != 1 ] ;then
echo "The parameters you enter is not correct !";
exit -1;
fi
while read line
do
{
#進(jìn)程控制
read -u 9
{
#isok=`curl -I -o /dev/null -s -w %{http_code} $line`
if [ "$isok" = "200" ]; then
echo $line "OK"
else
echo $line "no"
fi
echo -ne "\n" 1>&9
}&
}
done < $1
wait
echo "執(zhí)行結(jié)束"
rm tmp
上面的代碼就可以保證子進(jìn)程在指定數(shù)量了,其進(jìn)程控制原理是通過(guò)管道實(shí)現(xiàn)的,當(dāng)管道無(wú)內(nèi)容可讀時(shí)就不會(huì)執(zhí)行
{
#isok=`curl -I -o /dev/null -s -w %{http_code} $line`
if [ "$isok" = "200" ]; then
echo $line "OK"
else
echo $line "no"
fi
#寫(xiě)入一個(gè)換行符
echo -ne "\n" 1>&9
}&
而且每個(gè)進(jìn)程執(zhí)行完成后都會(huì)向管道寫(xiě)入一個(gè)換行符,從而保證進(jìn)程數(shù)是指定的。
這樣就能達(dá)到我們的目的了。
相關(guān)文章
shell產(chǎn)生隨機(jī)數(shù)七種方法的實(shí)現(xiàn)
這篇文章主要介紹了shell產(chǎn)生隨機(jī)數(shù)七種方法的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12shell基礎(chǔ)學(xué)習(xí)中的字符串操作、for循環(huán)語(yǔ)句示例
這篇文章主要介紹了shell基礎(chǔ)學(xué)習(xí)中的字符串操作、for循環(huán)語(yǔ)句示例2014-04-04Shell腳本實(shí)現(xiàn)SSL證書(shū)過(guò)期巡檢
我們知道?SSL?證書(shū)是會(huì)過(guò)期的,一旦過(guò)期之后需要重新申請(qǐng),如果沒(méi)有及時(shí)更換證書(shū)的話,就有可能導(dǎo)致網(wǎng)站出問(wèn)題,所以本文分享一個(gè)自動(dòng)檢測(cè)?SSL?是否過(guò)期的?shell?腳本吧2023-08-08shell腳本執(zhí)行命令自動(dòng)填充密碼(自動(dòng)輸入密碼)
這篇文章主要介紹了shell?執(zhí)行命令自動(dòng)填充密碼,文中結(jié)合實(shí)例代碼通過(guò)三種方式講解了Shell?腳本自動(dòng)輸入密碼的方法,需要的朋友可以參考下2023-02-02詳解Linux中查看jdk安裝目錄、Linux卸載jdk、rpm命令、rm命令參數(shù)
這篇文章主要介紹了詳解Linux中查看jdk安裝目錄、Linux卸載jdk、rpm命令、rm命令參數(shù) 的相關(guān)資料,需要的朋友可以參考下2018-03-03實(shí)時(shí)查看系統(tǒng)流量的Shell腳本分享
這篇文章主要介紹了實(shí)時(shí)查看系統(tǒng)流量的Shell腳本分享,本文直接給出實(shí)現(xiàn)代碼,使用時(shí)保存到一個(gè)sh文件中并運(yùn)行即可,需要的朋友可以參考下2014-12-12