第二十三天:trap


在有些狀況下,咱們不但願本身的shell腳本在運行時刻被中斷,好比說咱們寫得shell腳 
本設爲某一用戶的默認shell,使這一用戶進入系統後只能做某一項工做,如數據庫備份, 我 
們可不但願用戶使用ctrl+C之類便進入到shell狀態,作咱們不但願作的事情。這便用到了信號 
處理。 
kill -l能夠列出系統的信號名稱
一般咱們須要忽略的信號有四個,即:HUP, INT, QUIT, TSTP,也就是信號1, 2, 3, 24 
trap "" 1 2 3 24 或 trap "" HUP INT QUIT TSTP 
用 trap :1 2 3 24 或 trap HUP INT QUIT TSTP使其回覆默認值。
用stty -a能夠列出中斷信號與鍵盤的對應,分別執行上面的命令後,運行 
tail -f /etc/passwd, 而後嘗試用鍵盤中斷,試試兩種狀況(默認和忽略)下有何不一樣。 

 

經常使用系統變量: shell

$0           當前shell程序的名字 數據庫

$1 ~ $9   命令行上的第一到第九個參數 bash

$#           命令行上的參數個數 spa

$*           命令行上的全部參數 命令行

$@         分別用雙引號引用命令行上的全部參數 code

$$           當前進程的進程標識號(PID) 進程

$?           上一條命令的退出狀態 ci

$!            最後一個後臺進程的進程標識號 input

系統變量只能引用不能修改

trap命令用於指定在接收到信號後將要採起的行動,trap命令的參數分爲兩部分,前一部分是接收到指定信號時將要採起的行動,後一部分是要處理的信號名.

信     號 it

說     明

HUP(1)

掛起,一般因終端掉線或用戶退出而引起

INT(2)

中斷,一般因按下Ctrl+C組合鍵而引起

QUIT(3)

退出,一般因按下Ctrl+\組合鍵而引起

ABRT(6)

停止,一般因某些嚴重的執行錯誤而引起

ALRM(14)

報警,一般用來處理超時

TERM(15)

終止,一般在系統關機時發送


一. trap捕捉到信號以後,能夠有三種反應方式:

  1. 執行一段程序來處理這一信號
  2. 接受信號的默認操做
  3. 忽視這一信號

二. trap對上面三種方式提供了三種基本形式:
第一種形式的trap命令在shell接收到signal list清單中數值相同的信號時,將執行雙
引號中的命令串:
trap 'commands' signal-list
trap "commands" signal-list

第二種形式的trap命令,爲了恢復信號的默認操做:
trap signal-list

第三種形式的trap命令容許忽視信號:
trap " " signal-list

在第一種形式中,執行命令,對於雙引號和單引號是有區別的。

#/bin/bash

#忽略信號
#trap " " 2

#雙引號,shell第一次設置信號的時候就執行命令和變量的替換,時間不變 trap "echo `date`:can not terminate by ctrl+C" 2                

#單引號,要在shell探測到信號來的時候才執行命令和變量的替換,時間一直變 trap 'echo `date`:can not terminate by ctrl+C' 2                

while [ 1 ]
do
        echo -n "input a num : "
        read num 
        if [ $num -eq -1 ]
        then
                echo "bye"
                break
        fi
        echo "you have enter $num"
done
相關文章
相關標籤/搜索