linux與unix shell編程指南第26章shell 工具_(dá)W_第1頁
linux與unix shell編程指南第26章shell 工具_(dá)W_第2頁
linux與unix shell編程指南第26章shell 工具_(dá)W_第3頁
linux與unix shell編程指南第26章shell 工具_(dá)W_第4頁
linux與unix shell編程指南第26章shell 工具_(dá)W_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、 下載第26章 shell工 具本章將討論以下內(nèi)容:創(chuàng)建以日期命名的文件及臨時文件。信號。 trap命令以及如何捕獲信號。eval命令。 logger命令。 26.1創(chuàng)建保存信息的文件任何腳本都應(yīng)該能夠創(chuàng)建臨時文件或日志文件。在運(yùn)行腳本做備份時,最好是保存一個日志文件。這些日志文件通常在文件系統(tǒng)中保留幾周,過時將被刪除。 在開發(fā)腳本的時候,可能總要創(chuàng)建一些臨時的文件。在正常運(yùn)行腳本的時候,也要使用臨時文件保存信息,以便作為另外一個進(jìn)程的輸入??梢允褂?cat命令來顯示一個臨時文件的 內(nèi)容或把它打印出來。 26.1.1 使用date命令創(chuàng)建日志文件 在創(chuàng)建日志文件時,最好能夠使它具有唯一性,可以

2、按照日志文件創(chuàng)建的日期和時間來識別這些文件。我們可以使用date命令做到這一點。這樣就能夠使日期和時間成為日志文件名中的一部分。 為了改變?nèi)掌诤蜁r間的顯示格式,可以使用如下的命令: date option + % format使用加號+可以設(shè)置當(dāng)前日期和時間的顯示格式。下面的例子將日期以日、月、年的格式顯示: 下面是一些常用的日期格式: 下面的命令可以使時間按照hh:mm的格式顯示: 下面的命令可以顯示完整的時間: 290第五部分 高級shell編程技巧 下載注意,如果希望在日期和時間的顯示中包含空格,要使用雙引號。 在文件名中含有日期的一個簡單辦法就是使用置換。把含有你所需要的日期格式的變量

3、附加在相應(yīng)的日志文件名后面即可。 在下面的例子中我們創(chuàng)建了兩個日志文件,一個使用了 dd,mm,yy的日期格式,另一個使用了dd,hh,mm的時間格式。 下面就是這個腳本。 運(yùn)行上面的腳本后,得到這樣兩個日志文件。 26.1.2 創(chuàng)建唯一的臨時文件 在本書的前面討論特殊變量時,曾介紹變量 $,該變量中保存有你所運(yùn)行的當(dāng)前進(jìn)程的進(jìn)程號。可以使用它在我們運(yùn)行的腳本中創(chuàng)建一個唯一的臨時文件,因為該腳本在運(yùn)行時的進(jìn)程號是唯一的。我們只要創(chuàng)建一個文件并在后面附加上 $即可。在腳本結(jié)束時,只需刪除帶有$擴(kuò)展的臨時文件即可。 Shell將會把$解析為當(dāng)前的進(jìn)程號,并刪除相應(yīng)的文件,而不會影響以其他進(jìn)程號做后

4、綴的文件。 在命令行中輸入如下的命令: 這就是當(dāng)前的進(jìn)程號,如果你執(zhí)行這個命令,看到的結(jié)果可能會有所不同?,F(xiàn)在如果我創(chuàng)建另一個登錄進(jìn)程并輸入同樣的命令,將會得到一個不同的進(jìn)程號,因為我已經(jīng)啟動了一 個新的進(jìn)程。 下面的例子中,創(chuàng)建了兩個臨時文件,并進(jìn)行了相應(yīng)的操作,最后在結(jié)束時刪除了這些 文件。 第 26 章 shell 工 具291 下載當(dāng)上面的腳本運(yùn)行時,將會創(chuàng)建這樣兩個文件: 在執(zhí)行rm /tmp/*.$時,shell實際上將該命令解析為rm /tmp/*.408。 記住,該進(jìn)程號只在當(dāng)前進(jìn)程中唯一。例如,如果我再次運(yùn)行上面的腳本,將會得到一個新的進(jìn)程號,因為我已經(jīng)創(chuàng)建了一個新的進(jìn)程。

5、如果文件有特殊用途的話,那么創(chuàng)建含有日期的文件,就可以使你很容易地查找到它們。而且還可以很容易地按照日期刪除文件,因為這樣一眼就能看出哪個文件是最新的,哪個文件是最“舊”的。 還可以使用這種方法來快速地創(chuàng)建臨時文件,它們在當(dāng)前進(jìn)程中是唯一的。在腳本結(jié)束 之前,也很容易刪除這些臨時文件。 26.2信號信號就是系統(tǒng)向腳本或命令發(fā)出的消息,告知它們某個的發(fā)生。這些通常是內(nèi)存錯誤 ,訪問權(quán)限問題或某個用戶試圖停止你的進(jìn)程。信號實際上是一些數(shù)字。下表列出了 最常用的信號及它們的含義。 信號信 號 名 含義12391115SIGHUP SIGINT SIGQUIT SIGKILL SIGSEGVSIGTE

6、RM掛起或父進(jìn)程被殺死 來自鍵盤的中斷信號,通常是 從鍵盤退出無條件終止 段(內(nèi)存)沖突 軟件終止(缺省殺進(jìn)程信號) 還有信號0,我們前面在創(chuàng)建.logout文件時已經(jīng)遇到過。該信號為“退出 shell”信號。為了發(fā)出信號0,只要從命令行鍵入exit,或在一個進(jìn)程或命令行中使用即可。 發(fā)送信號可以使用如下的格式: kill -signal no:| signal name process ID使用kill命令時不帶任何信號或名字意味著使用缺省的信號 15??梢允褂萌缦碌拿盍谐鏊械男盘枺?292第五部分 高級shell編程技巧 下載26.2.1 殺死一個進(jìn)程 發(fā)送信號1將使一個進(jìn)程重新讀入配

7、置文件。例如,你在運(yùn)行域名服務(wù)( DNS)守護(hù)進(jìn)程named,現(xiàn)在你對域名數(shù)據(jù)庫文件做了某些修改,這時不需要殺死該守護(hù)進(jìn)程再重新啟動,只需使用kill -1命令向其發(fā)送信號1。Named進(jìn)程將重新讀入它的配置文件。 下面的例子向系統(tǒng)中一個名為 mon_web的進(jìn)程發(fā)送信號9(無條件終止)來殺死它。首先 使用ps命令得到相應(yīng)的進(jìn)程號。 如果系統(tǒng)不支持ps -ef命令,那么可以使用ps xa。為了殺死該進(jìn)程,我可以使用下面的兩種方法之一: kill -9 157或 kill -s SIGKILL157在有些系統(tǒng)中,不必使用-s,例如: kill SIGKILL 157。 下面的腳本將根據(jù)進(jìn)程名來殺

8、死一個進(jìn)程,擬被殺死的進(jìn)程名作為該腳本的一個參數(shù)。在執(zhí)行相應(yīng)的命令之前,將會首先檢查是否存在這樣的進(jìn)程。在這里使用 grep命令來匹配相應(yīng)的進(jìn)程名。如果匹配成功,則向用戶提示進(jìn)程已經(jīng)找到,并詢問用戶是否殺死該進(jìn)程。最后使用kill - 9命令殺死相應(yīng)的進(jìn)程。 下面就是該腳本。 第 26 章 shell 工 具293 下載運(yùn)行該腳本將會產(chǎn)生如下的輸出: 在使用該腳本時,要確信存在相應(yīng)的進(jìn)程: 26.2.2 檢測信號 有些信號可以被應(yīng)用程序或腳本捕獲,并依據(jù)該信號采取相應(yīng)的行動。另外一些信號不能獲。例如,如果一個命令收到了信號 9,就無法再捕捉其他信號。 在編寫shell腳本時,只需關(guān)心信號 1、

9、2、3和15。當(dāng)腳本捕捉到一個信號后,它可能會采取下面三種操作之一: 1) 不采取任何行動,由系統(tǒng)來進(jìn)行處理。 2) 捕獲該信號,但忽略它。 294第五部分 高級shell編程技巧 下載3) 捕獲該信號,并采取相應(yīng)的行動。 大多數(shù)的腳本都使用第一種處理方法,這也是到目前為止本書中所有腳本所采取的處理方法。 如果想要采取另外兩種處理方法,必須使用 trap命令。 26.3traptrap可以使你在腳本中捕捉信號。該命令的一般形式為: trap name signal(s)其中, name是捕捉到信號以后所采取的一系列操作。實際生活中, name一般是一個專門用來處理所捕捉信號的函數(shù)。 Name需

10、要用雙引號(“ ”)引起來。Signal就是待捕捉的信號。 腳本在捕捉到一個信號以后,通常會采取某些行動。最常見的行動包括: 1) 清除臨時文件。 2) 忽略該信號。 3) 詢問用戶是否終止該腳本的運(yùn)行。 下表列出了一些最常見的trap命令用法: trap 2 3trapcommands 2 3trap 2 3忽略信號2和信號3,用戶不能終止該腳本 如果捕捉到信號2或3,就執(zhí)行相應(yīng)的commands命令復(fù)位信號2和3,用戶可以終止該腳本 也可以使用單引號()來代替雙引號(“”);其結(jié)果是一樣的。26.3.1 捕獲信號并采取相應(yīng)的行動 下面的例子一經(jīng)運(yùn)行就開始計數(shù)直至用戶按 (信號2)。這時該腳

11、本將會顯示出當(dāng)前的循環(huán)數(shù)字,然后退出。 在本例中trap命令的格式為: trap do_ something signal下面就是該腳本: no:( s)現(xiàn)在讓我們來仔細(xì)分析一下該腳本。 第 26 章 shell 工 具295 下載trap my_ exit 2在本例中,由于設(shè)置了trap命令,所以在捕捉到信號 2以后,雙引號內(nèi)的my_exit函數(shù)將被執(zhí)行。 函數(shù)my_exit將在腳本捕捉到信號 2后被調(diào)用;用戶將會看到 $LOOP變量的內(nèi)容,即用戶按時的計數(shù)值。在實際中,通常捕捉到信號 2后所調(diào)用的函數(shù)是用來完成清除臨時文件等任務(wù)的。 下面是該腳本的運(yùn)行結(jié)果: 26.3.2 捕獲信號并采取行

12、動的另一個例子 下面就是一個捕獲信號后清除臨時文件的例子。 下面的腳本在運(yùn)行時不斷使用 df和ps命令向臨時文件HOLD1.$和HOLD2.$中寫入相應(yīng)的信息。你應(yīng)該還記得 $表示當(dāng)前的進(jìn)程號。當(dāng)用戶按 時,這些臨時文件將被清除。 296第五部分 高級shell編程技巧 下載上面的腳本在運(yùn)行時會產(chǎn)生如下的結(jié)果: 當(dāng)收到信號2或3時,盡管一般情況下這都不是誤操作,但是為了安全起見,不妨給用戶一個選擇的機(jī)會,這樣用戶在不小心按下 后,仍然可以撤消剛才的動作。 在下面的例子中,在腳本捕捉到信號 2后將會向用戶提供一個選擇,詢問用戶是否真的要退出。這里使用case語句來決定采取何種操作。 如果用戶希望

13、退出,他或她可以選擇 1,此時當(dāng)前函數(shù)會以狀態(tài) 1退出,而另一個清除進(jìn)程將會據(jù)此啟動。如果用戶并不希望退出,那么可以選擇 2或不做任何選擇,此時case語句將會使用戶退回到腳本中原來的地方。在case語句中一定要包含用戶輸入空字符串的情況。 下面的函數(shù)在收到信號后,將會向用戶提供選擇: 下面是完整的腳本: 第 26 章 shell 工 具297 下載當(dāng)上面的腳本運(yùn)行時,只要在輸入任何域時按下 ,就會得到一個選擇:是繼續(xù) 運(yùn)行還是退出。 26.3.3 鎖住終端 下面的腳本是另一個捕獲信號的例子。該腳本名為 lockit,它將使用一個連續(xù)不斷的while 循環(huán)鎖住終端。在該腳本中, trap命令捕

14、捉信號2、3和15。如果一個用戶試圖中斷該腳本的運(yùn)行,將會得到一個不成功的提示。 在腳本初次執(zhí)行時,將會被提示輸入一個口令。在解鎖終端時沒有任何提示,可以直接輸入口令并按回車鍵。該腳本會從終端讀入所輸入的口令,并與預(yù)先設(shè)置的口令做比較,如果一致就解鎖終端。 如果忘記了自己的口令,那么只好登錄到另一個終端上并殺死該進(jìn)程。在本例中沒有對口令的長度加以限制這完全取決于你。 如果你從另外一個終端上殺死了該進(jìn)程,當(dāng)再次回到這個終端時,可能會遇到終端設(shè)置問題,例如回車鍵不起作用。這時可以試著使用下面的命令,這樣可以解決大部分問題。 $ stty sane下面就是該腳本。 298第五部分 高級shell編程

15、技巧 下載下面是lockit腳本運(yùn)行時的輸出: 接著屏幕就被清除。如果按回車鍵或其他錯誤的口令,該腳本將會輸出: 現(xiàn)在輸入正確的口令: 現(xiàn)在又回到命令提示符下了。26.3.4 忽略信號 在用戶登錄時,系統(tǒng)將會執(zhí)行/etc/profile文件,根用戶不希望其他普通用戶打斷這一進(jìn)程。他通常通過設(shè)置trap來屏蔽信號1、2、3和15,然后在用戶讀當(dāng)天的消息時重新打開這些信號。最后仍然回到屏蔽這些信號的狀態(tài)。 在編寫腳本時也可以采用類似的辦法。在腳本運(yùn)行的某些關(guān)鍵時刻,比如打開了很多文 第 26 章 shell 工 具299 下載件時,不希望該腳本被中斷,以免破壞這些文件。通過設(shè)置 trap來屏蔽某些

16、信號就可以解決這個問題。在這些關(guān)鍵性的處理過程結(jié)束后,再重新打開信號。 忽略信號的一般格式為(信號 9除外): trapsignal no:(s)注意,在雙引號之間沒有任何字符,為了重新回到捕捉信號的狀態(tài),可以使用如下的命令: trapdo something signalno:( s)下面我們來總結(jié)一下上述方法。 trap 1 2 3 15:忽略信號。關(guān)鍵性的處理過程 trapmy_exit 1 2 3 15:重新回到捕捉信號的狀態(tài),在捕捉到信號后調(diào)用 my_exit函數(shù)。下面就是一個這樣的例子,其中的“關(guān)鍵”過程實際上是一個 while循環(huán),但它能夠很好 地說明這種方法。在第一個循環(huán)中,通

17、過設(shè)置 trap來屏蔽信號,但是在第二個例子中,又回到捕捉信號的狀態(tài)。 兩個循環(huán)都只數(shù)到6,不過在循環(huán)中使用了一個sleep命令,這樣就可以有充分的時間來實驗中斷該循環(huán)。 下面就是腳本。 300第五部分 高級shell編程技巧 下載在上面的腳本在運(yùn)行時,如果我們在第一個循環(huán)期間按下 ,它不會有任何反應(yīng), 這是因為我們通過設(shè)置trap屏蔽了信號;而在第二個循環(huán)中由于重新回到捕捉信號的狀態(tài),按 下就會調(diào)用my_exit函數(shù)。 當(dāng)腳本捕獲到信號時,通過使用trap命令,可以更好地控制腳本的運(yùn)行。捕獲信號并進(jìn)行 處理是一個腳本健壯性的標(biāo)志。 26.4evaleval命令將會首先掃描命令行進(jìn)行所有的置換

18、,然后再執(zhí)行該命令。該命令適用于那些一次掃描無法實現(xiàn)其功能的變量。該命令對變量進(jìn)行兩次掃描。這些需要進(jìn)行兩次掃描的變量有時被稱為復(fù)雜變量。不過我覺得這些變量本身并不復(fù)雜。 eval命令也可以用于回顯簡單變量,不一定是復(fù)雜變量。 解釋eval命令是怎么回事的最好辦法就是看幾個例子。 26.4.1 執(zhí)行含有字符串的命令 我們首先創(chuàng)建一個名為testf的小文件,在這個小文件中含有一些文本。接著,將 cat testf賦給變量MYFILE,現(xiàn)在我們echo該變量,看看是否能夠執(zhí)行上述命令。 現(xiàn)在我們將cat testf賦給變量MYFILE。 $ MYFILE“= ca t te st”f 第 26 章

19、 shell 工 具301 下載如果我們echo該變量,我們將無法列出testf文件中的內(nèi)容。 讓我們來試一下eval命令,記住eval命令將會對該變量進(jìn)行兩次掃瞄。 從上面的結(jié)果可以看出,使用eval命令不但可以置換該變量,還能夠執(zhí)行相應(yīng)的命令。第一次掃描進(jìn)行了變量置換,第二次掃描執(zhí)行了該字符串中所包含的命令 cat testf。 下面是另一個例子。一個名為CAT_PASSWD的變量含有字符串“ cat /etc/passwd | more”。 eval 命令可以執(zhí)行該字符串所對應(yīng)的命令。 eval命令還可以用來顯示出傳遞給腳本的最后一個參數(shù)?,F(xiàn)在來看下面的這個例子。 在運(yùn)行上述腳本時,我們

20、會看到如下的結(jié)果(你所看到進(jìn)程號可能會不一樣):在上面的腳本中, eval命令首先把$#解析為當(dāng)前shell的參數(shù)個數(shù),然后在第二次掃描時 得出最后一個參數(shù)。 26.4.2 給每個值一個變量名 可以給一個值一個變量名。下面我對此做些解釋,假定有一個名為 data的文件: 你希望該文件中的第一列成為變量名,第二列成為該變量的值,這樣就可以: 怎樣才能做到這一點呢?當(dāng)然是使用eval命令。 302第五部分 高級shell編程技巧 下載我們用data文件的第一行來解釋上述腳本的執(zhí)行過程,該腳本讀入“ PC”和“ 486”兩個詞,把它們分別賦給變量 NAME和TYPE。Eval命令的第一次掃描把NAM

21、E和TYPE分別置換為“PC”和“486”,第二次掃描時將PC作為變量,并將“ 486”作為變量的值。 下面是運(yùn)行上述腳本的結(jié)果: eval命令并不是一個在腳本中很常見的命令,但是如果需要對變量進(jìn)行兩次掃瞄的話,就 要使用eval命令了。 26.5logger命令 系統(tǒng)中含有相當(dāng)多的日志文件。其中的一個日志文件叫作 messages,它通常位于/var/adm 或/var/log目錄下。一個名為syslog的配置文件可以用來定義記錄在messages文件中的消息,這些消息有一定的格式。如果想知道系統(tǒng)中的相應(yīng)配置,可以查看 /etc/syslog.conf文件。該文件中包含了用于發(fā)送各種不同類型

22、消息的工具及它們的優(yōu)先級。 這里我們并不想深入探討UNIX和LINUX是如何向該文件中記錄信息的。我們現(xiàn)在只要知道這些消息有不同的級別,從信息性的消息到關(guān)鍵性的消息。 還可以使用logger命令向該文件發(fā)送消息。在使用該命令之前,最好查閱連機(jī)手冊,因為在不同供應(yīng)商所提供的操作系統(tǒng)上該命令的語法也有所不同。 不過,由于這里只涉及到信息性的消息,因此不必?fù)?dān)心下面的命令不安全。你可能會出于下列的原因向該文件中發(fā)送消息: 在某一個特定的時間段出現(xiàn)的訪問或登錄。 你的某些執(zhí)行關(guān)鍵任務(wù)的腳本運(yùn)行失敗。 監(jiān)控腳本的報告。 下面是/var/adm/messages文件的例子。在系統(tǒng)上所看到的相應(yīng)文件可能和下面的例子有少許差別。 logger命令的一般形式為: logger -p -Ime

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論