新聞中心
Linux中,shell腳本如何使用信號機(jī)制去控制線程的開啟關(guān)閉
trap是Linux的內(nèi)建命令,用于捕捉信號,trap命令可以指定收到某種信號時(shí)所執(zhí)行的命令。trap命令的格式如下:trap command sig1 sig2 ... sigN,當(dāng)接收到sinN中任意一個(gè)信號時(shí),執(zhí)行command命令,command命令完成后繼續(xù)接收到信號前的操作,直到腳本結(jié)束。?利用trap命令捕捉INT信號(即與Ctrl+c綁定的中斷信號)。trap還可以忽略某些信號,將command用空字符串代替即可,如trap "" TERM INT,忽略kill %n和Ctrl+c發(fā)送的信號(kill發(fā)送的是TERM信號)。Linux更強(qiáng)勁的殺死進(jìn)程的命令:kill -9 進(jìn)程號(或kill -9 %n作業(yè)號)等價(jià)與kill -KILL 進(jìn)程號。
在西山等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需求定制設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,成都全網(wǎng)營銷推廣,外貿(mào)營銷網(wǎng)站建設(shè),西山網(wǎng)站建設(shè)費(fèi)用合理。
舉個(gè)例子:
最近小A需要生產(chǎn)2015年全年的KPI數(shù)據(jù)報(bào)表,現(xiàn)在小A已經(jīng)將生產(chǎn)腳本寫好了,生產(chǎn)腳本一次只能生產(chǎn)指定一天的KPI數(shù)據(jù),假設(shè)跑一次生產(chǎn)腳本需要5分鐘,那么:
如果是循環(huán)順序執(zhí)行,那么需要時(shí)間:5 * 365 = 1825 分鐘,約等于 6 天
如果是一次性放到linux后臺并發(fā)執(zhí)行,365個(gè)后臺任務(wù),系統(tǒng)可承受不住哦!
既然不能一次性把365個(gè)任務(wù)放到linux后臺執(zhí)行,那么,能不能實(shí)現(xiàn)自動地每次將N個(gè)任務(wù)放到后臺并發(fā)執(zhí)行呢?當(dāng)然是可以的啦。
#!?/bin/bash
source?/etc/profile;
#?-----------------------------
tempfifo=$$.fifo????????#?$$表示當(dāng)前執(zhí)行文件模碰春的PID
begin_date=$1???????????#?開始時(shí)間
end_date=$2?????????????#?結(jié)束時(shí)間
if?[?$#?-eq?2?]?
then
if?[?"$begin_date"?\?"$end_date"?]
then
echo?"Error!?$begin_date?is?greater?than?$end_date"
exit?1;
fi
else
echo?"Error!?Not?enough?params."
echo?"Sample:?sh?loop_kpi?2015-12-01?2015-12-07"
exit?2;
fi
#?-----------------------------
trap?"exec?1000-;exec?1000-;exit?0"?2
mkfifo?$tempfifo
exec?1000$tempfifo
rm?-rf?$tempfifo
for?((i=1;?i=8;?i++))
do
echo?1000
done
while?[?$begin_date?!=?$end_date?]
do
read?-u1000
{
echo?$begin_date
hive?-f?kpi_report.sql?--hivevar?date=$begin_date
echo?1000
}?
begin_date=`date?-d?"+1?day?$begin_date"?+"%Y-%m-%d"`
done
wait
echo?"done!!!!!!!!!!"
第6~22行:比如:sh loop_kpi_report.sh 2015-01-01 2015-12-01:
$1表示腳本入?yún)⒌牡谝粋€(gè)參數(shù),等于2015-01-01
$2表示腳本入?yún)⒌牡诙€(gè)參數(shù),等于2015-12-01
$#表示腳本入?yún)⒌膫€(gè)數(shù),等于2
第13行用于比較傳入的兩個(gè)日期的大小,\是轉(zhuǎn)義
第26行:表示在腳本運(yùn)行過程中,如果接收到Ctrl+C中斷命令,則關(guān)閉文件描述符1000的讀寫,并正常退出
exec 1000-;表示關(guān)閉文件描述符1000的寫
exec 1000-;表示關(guān)閉文件描述符1000的讀
trap是捕獲中斷命令
第27~29行:
第27行,創(chuàng)建一個(gè)管道文件
第28行,將文件描述符1000與FIFO進(jìn)行綁定,讀的綁定,寫的綁定,則標(biāo)識對文件描述符1000的所有操作等同于對管道文件$tempfifo的操作
第29行,可能會有這樣的疑問:為什么不直接使用管道文件呢?事實(shí)上這并非多此一舉,管道的一個(gè)重要特性,就是讀寫必須同時(shí)存在,缺失某一個(gè)操作,另一個(gè)操作就是滯留,而第28行的綁定文件描述符(讀、寫綁定)正好解決了這個(gè)問題
第31~34行:對文件描述符1000進(jìn)行寫入操作。通過循環(huán)寫入8個(gè)空行,這個(gè)8就是我吵模們要定義旦耐的后臺并發(fā)的線程數(shù)。為什么是寫空行而不是寫其它字符?因?yàn)楣艿牢募淖x取,是以行為單位的
第37~42行:
第37行,read -u1000的作用就是讀取管道中的一行,在這里就是讀取一個(gè)空行;每次讀取管道就會減少一個(gè)空行
第39~41行,注意到第42行結(jié)尾的嗎?它表示進(jìn)程放到linux后臺中執(zhí)行
第41行,執(zhí)行完后臺任務(wù)之后,往文件描述符1000中寫入一個(gè)空行。這是關(guān)鍵所在了,由于read -u1000每次操作,都會導(dǎo)致管道減少一個(gè)空行,當(dāng)linux后臺放入了8個(gè)任務(wù)之后,由于文件描述符1000沒有可讀取的空行,將導(dǎo)致read -u1000一直處于等待。
linux c語言中在某個(gè)線程中怎樣終止整個(gè)程序?
線程
可以用pthread_kill函數(shù)高銀
傳遞信號SIGSTOP掛起
傳遞SIGCONT 恢復(fù)
進(jìn)程
調(diào)用系統(tǒng)者核的stop掛起
或者用kill -stop 掛起
類似的 用戚嫌宴SIGCONT 恢復(fù)。
名稱欄目:linux停止線程命令 linux停止進(jìn)程kill
URL地址:http://ef60e0e.cn/article/dspjhjc.html