當前位置:首頁 » 編程軟體 » shell腳本ctrlc

shell腳本ctrlc

發布時間: 2024-10-06 20:10:37

linux中,shell腳本如何使用信號機制去控制線程的開啟關閉

trap是Linux的內建命令,用於捕捉信號,trap命令可以指定收到某種信號時所執行的命令。trap命令的格式如下:trap command sig1 sig2 ... sigN,當接收到sinN中任意一個信號時,執行command命令,command命令完成後繼續接收到信號前的操作,直到腳本結束。利用trap命令捕捉INT信號(即與Ctrl+c綁定的中斷信號)。trap還可以忽略某些信號,將command用空字元串代替即可,如trap "" TERM INT,忽略kill %n和Ctrl+c發送的信號(kill發送的是TERM信號)。Linux更強勁的殺死進程的命令:kill -9 進程號(或kill -9 %n作業號)等價與kill -KILL 進程號。

舉個例子

最近小A需要生產2015年全年的KPI數據報表,現在小A已經將生產腳本寫好了,生產腳本一次只能生產指定一天的KPI數據,假設跑一次生產腳本需要5分鍾,那麼:

如果是循環順序執行,那麼需要時間:5 * 365 = 1825 分鍾,約等於 6 天

如果是一次性放到linux後台並發執行,365個後台任務,系統可承受不住哦!

既然不能一次性把365個任務放到linux後台執行,那麼,能不能實現自動地每次將N個任務放到後台並發執行呢?當然是可以的啦。

#!/bin/bash
source/etc/profile;
#-----------------------------
tempfifo=$$.fifo#$$表示當前執行文件的PID
begin_date=$1#開始時間
end_date=$2#結束時間
if[$#-eq2]
then
if["$begin_date">"$end_date"]
then
echo"Error!$begin_dateisgreaterthan$end_date"
exit1;
fi
else
echo"Error!Notenoughparams."
echo"Sample:shloop_kpi2015-12-012015-12-07"
exit2;
fi
#-----------------------------
trap"exec1000>&-;exec1000<&-;exit0"2
mkfifo$tempfifo
exec1000<>$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-fkpi_report.sql--hivevardate=$begin_date
echo>&1000
}&
begin_date=`date-d"+1day$begin_date"+"%Y-%m-%d"`
done
wait
echo"done!!!!!!!!!!"



第6~22行:比如:sh loop_kpi_report.sh 2015-01-01 2015-12-01:

$1表示腳本入參的第一個參數,等於2015-01-01

$2表示腳本入參的第二個參數,等於2015-12-01

$#表示腳本入參的個數,等於2

第13行用於比較傳入的兩個日期的大小,>是轉義

第26行:表示在腳本運行過程中,如果接收到Ctrl+C中斷命令,則關閉文件描述符1000的讀寫,並正常退出

exec 1000>&-;表示關閉文件描述符1000的寫

exec 1000<&-;表示關閉文件描述符1000的讀

trap是捕獲中斷命令

第27~29行:

第27行,創建一個管道文件

第28行,將文件描述符1000與FIFO進行綁定,<讀的綁定,>寫的綁定,<>則標識對文件描述符1000的所有操作等同於對管道文件$tempfifo的操作

第29行,可能會有這樣的疑問:為什麼不直接使用管道文件呢?事實上這並非多此一舉,管道的一個重要特性,就是讀寫必須同時存在,缺失某一個操作,另一個操作就是滯留,而第28行的綁定文件描述符(讀、寫綁定)正好解決了這個問題

第31~34行:對文件描述符1000進行寫入操作。通過循環寫入8個空行,這個8就是我們要定義的後台並發的線程數。為什麼是寫空行而不是寫其它字元?因為管道文件的讀取,是以行為單位的

第37~42行:

第37行,read -u1000的作用就是讀取管道中的一行,在這里就是讀取一個空行;每次讀取管道就會減少一個空行

第39~41行,注意到第42行結尾的&嗎?它表示進程放到linux後台中執行

第41行,執行完後台任務之後,往文件描述符1000中寫入一個空行。這是關鍵所在了,由於read -u1000每次操作,都會導致管道減少一個空行,當linux後台放入了8個任務之後,由於文件描述符1000沒有可讀取的空行,將導致read -u1000一直處於等待。

② 寫一個簡單的Shell腳本,腳本運行時讓Ctrl-C無法中斷該shell腳本

捕捉信號,然後執行echo顯示提示
調用程序處理信號
trap commands signal-list
常見信號
HUP(1) 掛起,通常因終端掉線或用戶退出而引發
INT(2) 中斷,通常因按下Ctrl+C組合鍵而引發
QUIT(3) 退出,通常因按下Ctrl+\組合鍵而引發
ABRT(6) 中止,通常因某些嚴重的執行錯誤而引發
ALRM(14) 報警,通常用來處理超時
TERM(15) 終止,通常在系統關機時發送
http://www.lslnet.com/linux/dosc1/65/linux-423392.htm
INT 就是中斷信號(linux 中是ctrl-C,SCO unix 中是"del"鍵)
trap 就是捕捉信號,與所提供的arg聯系起來,就是當捕捉到某個信號時執行arg規定的動作。
如文件a:
#!/bin/bash
trap "echo -e \"\nreceive int\n\";exit" INT
while :
do
((i++))
done
由於是死循環,不會退出,按下ctrl-c鍵後,程序會顯示
receive int
並退回$狀態
當arg為空時表示忽略後面指出的信號
trap -p
可顯示信號關聯的命令。請指正。

③ 寫一個簡單的shell腳本,腳本運行時讓CTRL+C無法中斷的該shell腳本

在shell腳本中用trap命令捕獲SIGINT信號(ctrl+c產生的中斷信號)就可以了
系統給出的SIGINT信號數字為2
2) SIGINT
所以,只要在腳本中要循環執行的內容前面加入以下語句即可:
trap "" 2
或者直接寫信號名稱也可以:
trap "" SIGINT
即,當收到信號SIGINT時忽略它,不做任何處理。

④ 執行shell腳本三種方法的區別:(sh、exec、source)

使用$ sh script.sh執行腳本時,當前shell是父進程,生成一個子shell進程,在子shell中執行腳本。腳本執行完畢,退出子shell,回到當前shell。
./script.sh與 sh script.sh等效。

使用$ source script.sh方式,在當前上下文中執行腳本,不會生成新的進程。腳本執行完畢,回到當前shell。
source方式也叫點命令。
. script.sh與 source script.sh等效。

使用exec command方式,會用command進程替換當前shell進程,並且保持PID不變。執行完畢,直接退出,不回到之前的shell環境。

二、測試驗證
vi loop.sh

顯示當前進程

sh的方式:執行loop.sh列印執行進程

source方式:執行loop.sh列印執行進程

exec方式:執行loop.sh列印執行進程

按下ctrl+C

sh方式:父進程是6770,執行loop.sh時的子進程是13736。執行完畢後回到父進程shell。
source方式:父進程和子進程都是6770(執行時沒有新的進程),執行完畢會回到父進程shell。
exec方式:進程PID沒有改變都是6770,執行完畢(ctrl+C強制關閉)時直接退出了shell。腳本執行時替換了父進程的shell,執行完畢後直接退出,沒有回到之前的shell。

⑤ linux中Ctrl+c跟kill -9和kill -15的區別哪裡謝謝!

ctrl+c是終止當前在終端窗口中運行的命令或腳本,
kill -9 pid,是不顧後果的強制終止(如果的你的速度夠快,有時候是和ctrl+c是一樣的)
kill -15 pid,是先關閉和其有關的程序,再將其關閉

⑥ shell腳本執行後必須按ctrl+c才能繼續執行下一步,該如何處理

腳本程序是卡在a函數中命令了,用echo 列印下是哪條命令卡住不運行,找到後再下是什麼原因

rostopicpub/robot_move_absolutedg_msgs/robotMoveAbsolute"msgid:''
echo1111
bourn:$num1
echo2222
offset:0
echo3333
vel:0"
echo4444
熱點內容
我的世界網易版怎麼找回伺服器 發布:2024-11-04 02:45:49 瀏覽:568
如何銀行卡綁定支付寶快捷支付密碼是什麼 發布:2024-11-04 02:45:38 瀏覽:585
20款裂行都有哪些配置 發布:2024-11-04 02:44:06 瀏覽:166
python中merge 發布:2024-11-04 02:44:06 瀏覽:908
騰訊通中心伺服器如何設置 發布:2024-11-04 02:42:37 瀏覽:165
androidgooglemap開發 發布:2024-11-04 02:36:37 瀏覽:89
80s緩存 發布:2024-11-04 02:34:11 瀏覽:391
java的swing教程 發布:2024-11-04 02:34:10 瀏覽:779
mysql的查詢緩存 發布:2024-11-04 02:31:53 瀏覽:366
python模塊編寫 發布:2024-11-04 02:30:44 瀏覽:732