Linux Shell 高級編程技巧2----shell工具

2.shell工具
    2.1.日誌文件
        簡介
            建立日誌文件是很重要的,記錄了重要的信息。一旦出現錯誤,這些信息對於咱們排錯是很是有用的;監控的信息也能夠記錄到日誌文件
        經常使用的日誌文件的方法
            以時間爲標識的日誌文件
                例子shell

#!/bin/bash
#當前的日期
current_date=`date "+%Y%m%d"`
#今天的日誌文件名
todaylog="log/${current_date}.log"
#若是日誌文件不存在,建立一個
if [! -f $todaylog ]
then
    touch $todaylog
fi
#輸出日誌到日誌文件
log_time_format=`date "+%Y-%m-%d %T"`
echo "${log_time_format} 命令開始" >>$todaylog
#
#command blocks
sleep 4
#
#輸出日誌到日誌文件
log_time_format=`date "+%Y-%m-%d %T"`
echo "${log_time_format}命令結束" >>$todaylog

            以進程號爲標識的臨時文件
                例子bash

#!/bin/bash
#取得當前進程號
current_PID=$$
#得到特定進程的進程號並重定向到一個臨時文件中
ps -aux | grep "/user/sbin/httpd" | grep -v "grep" | awk '{print $2}' > /tmp/${current_PID}.txt
#命令塊開始
for pid in `cat /tmp/${current_PID}.txt`
do
{
    echo "kill -9 $pid
    kill -9 $pid
}
done
#命令塊結束
#刪除臨時文件
rm -f /tmp/${current_PID}.txt

    2.2.信號
        簡介
            信號就是系統向腳本或命令發出的消息,告知它們某個事件的發生
        kill命令
            kill -l        列出全部的信號
            列出一些經常使用信號
                1    SIGHUP        掛起或父進程被殺死
                2    SIGINT        來自鍵盤的中斷信號,一般是 Ctrl-C
                3    SIGQUIT        從鍵盤退出
                9    SIGKILL        無條件退出
                11    SIGSEGV        段(內存)衝突
                15    SIGTERM        軟件終止(缺省殺進程)
                信號0爲」退出shell「信號。爲了發出信號0,只要從命令行鍵入exit,或者在一個進程或命令行中使用 Ctrl-D 便可
            kill        發送信號給進程
                例子
                    kill -s 信號名 進程號    這種格式來給進程發送相應信號
                        kill -s SIGKILL 7696    殺死進程號爲7696的進程
                    kill -信號的編號 進程號        這種格式來給進程發送對應的信號
                        kill -9 7696        殺死進程號爲7696的進程
    2.3.trap捕捉信號
        簡介
            信號能夠被應用程序或腳本捕獲,並依據該進程號(一、二、3和15)採起相應的行動。一些信號不能被捕獲。例如,若是一個命令收到了信號9,就沒法再捕捉其餘信號
        捕捉到一個信號後,它可能會採起下面的三種操做之一
            1.不採起任何行動,由系統來進行處理
            2.捕獲該信號,可是忽略它
            3.捕捉該信號,並採起相應行動
        trap可使你在腳本中捕捉信號。命令格式是:trap name signal(s)
            其中name是捕捉到信號之後所採起的一系列操做。實際中,name通常是一個專門用來處理所捕捉信號的函數。name須要用雙引號""引發來。
            signal就是待捕捉的信號
            最多見的行動是
                1.清除臨時文件
                2.忽略該信號    例子:trap "" 2 3
                3.詢問用戶是否終止該腳本的運行
        例子1函數

#!/bin/bash
#捕獲信號2,若是捕獲到就執行exitprocess
trap "exitprocess" 2
LOOP=0
function exitprocess()
{
    echo "You just hit <CTRL-C>, at number $LOOP"
    echo "I will now exit"
    exit 1
}
while:
do
    LOOP=$[$LOOP+1]
    echo $LOOP
    sleep 1
done

        例子2工具

#!/bin/bash
LOOP=0
trap "exitprocess" 2
HOLD1=/tmp/hold1.$$
HOLD2=/tmp/hold2.$$
function exitprocess()
{
    echo -e "\nRecived Interrupt...."
    echo -n "Do you really wish to exit?(Y/N)"
    read ANS
    case $ANS in
    Y|y)
        rm_tmp_file
        ;;
    N|n)
        ;;
    *)
        exitprocess
        ;;
    esac
}

function rm_tmp_file()
{
    echo "<CTRL-c> detected .. Now cleaning up ... Wait"
    rm /tmp/*.$$ 2>/dev/null
    exit 1
}
while :
do
    LOOP=$[$LOOP+1]
    echo $LOOP
    df >> $HOLD1
    ps -xa >> $HOLD2
    sleep 1
done

    2.4.eval
        簡介
            eval命令將會首先掃描命令行進行全部的置換,而後再執行該命令。該命令適用於那些一次掃描沒法實現其功能的變量
        例子,myfile 文件的內容是 ls -l
            MYFILE="cat myfile";`eval $MYFILE`
            等價於    eval `cat myfile`
            也就是執行 cat myfile 輸出結果所表明的那條命令
    2.5.logger
        簡介:
            logger命令向/var/log/messages文件發送消息
        logger命令通常形式是:
            logger -p -i message
            -p    爲優先級,這裏只涉及到提示用戶注意的優先級,這也是缺省值
            -i    在每一個信息中記錄發送消息的進程號
        例子
            logger -p -i "chinaitlab shenzhen"
            查看 /var/log/messages 就能夠查看插入了這條信息命令行

相關文章
相關標籤/搜索