時間:2017年09月26日星期二
說明:本文部份內容均摘取自書籍《Linux命令行與shell腳本編程大全》,版權歸原做者全部。《Linux命令行與shell腳本編程大全》(第三版)第十六章學習總結linux
本章內容shell
處理信號 之後臺模式運行腳本 禁止掛起 做業控制 修改腳本優先級 腳本執行自動化
Linux系統信號編程
Linux利用信號與運行在系統中的進程進行通訊 可使用信號來中止/啓動/終止進程 能夠經過對腳本進行編程,使其在收到特定信號時執行某些命令,從而控制shell腳本 默認狀況下,bash shell會忽略收到的任何3和15信號 可是bash shell會處理1和2信號
常見的Linux系統信號bash
信號:值:描述 1:SIGHUP:掛起進程 2:SIGINT:終止進程 3:SIGQUIT:中止進程 9:SIGKILL:無條件終止進程 15:SIGTERM:儘量終止進程 17:SIGSTOP:無條件中止進程,但不是終止進程 18:SIGTSTP:中止或暫停進程,但不終止進程 19:SIGCONT:繼續運行中止的進程
1.中斷進程app
使用Ctrl+C組合鍵會生成2(SIGINT)信號,並將其發送給當前在shell中運行的全部進程ide
執行命令oop
sleep 100 ^C
注:^代指Ctrl鍵學習
2.暫停進程url
使用Ctrl+Z組合鍵會生成18(SIGTSTP)信號,中止shell中運行的任何進程操作系統
執行命令
sleep 100 ^Z
當按鍵Ctrl+Z組合鍵時,bash shell會給出以下提示
[1]+ Stopped sleep 100 方括號中的數字時shell分配的做業號(job number) shell將shell中運行的每一個進程稱爲做業,併爲每一個做業分配惟一的做業號 若是shell回話中有已中止的做業,在退出shell時,bash會提醒你
經常使用操做
ps -l 查看已中止的做業,在S列中(進程狀態)顯示T的爲已中止的做業 kill -9 PID 終止指定PID的做業,終止已中止做業的PID 通俗來說,就是殺掉進程
命令格式:trap commands signals
命令說明:使用trap命令來指定shell腳本要監看並從shell中攔截的Linux信號
使用trap命令來忽略SIGINT信號
編寫test1.sh腳本
#!/bin/bash trap "echo 'Sorry!I have trappend Ctrl-C'" SIGINT echo This is a test script count=1 while [ $count -le 10 ] do echo "Loop #$count" sleep 1 count=$[ $count+1 ] done echo "This is the end of the test script"
捕獲shell腳本的退出EXIT信號
編寫test2.sh腳本
#!/bin/bash trap "echo Goodbye..." EXIT count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$[ $count+1 ] done
修改信號捕獲,腳本仍然會根據最初的trap命令進行處理
編寫test3.sh腳本
#!/bin/bash # trap "echo 'Sorry.. Ctrl+C is trapped.'" SIGINT # count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$[ $count+1 ] done # trap "echo 'I modified the trap!'" SIGINT # count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$[ $count+1 ] done
在trap和信號列表之間加上兩個破折號刪除已設置好的捕獲並恢復默認行爲
編寫test3b.sh腳本
#!/bin/bash # trap "echo 'Sorry.. Ctrl+C is trapped.'" SIGINT # count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$[ $count+1 ] done # # Remove the trap trap -- SIGINT echo "I just removed the trap" # count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$[ $count+1 ] done
敲門:也能夠在trap命令後使用單破折號來恢復信號的默認行爲。單破折號和雙破折號均可以正常發揮做用
在命令後加個&符之後臺模式運行shell腳本
編寫test4.sh腳本
#!/bin/bash count=1 while [ $count -le 10 ] do sleep 1 count=$[ $count+1 ] done
執行命令
./test4.sh &
而後顯示[1] 3231
方括號中的表示後臺進程的做業號,後面的數字爲進程的進程ID(PID)
當後臺進程運行時,它仍然會使用終端顯示器來顯示STDOUT和STDERR消息
編寫test5.sh腳本
#!/bin/bash # echo "Start the test script" count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 5 count=$[ $count+1 ] done # echo "Test script is complete"
當腳本在後臺模式運行時,腳本的輸出和輸入的命令以及命令輸出全都混在了一塊兒,最好是將後臺運行的腳本的STDOUT和STDERR進行重定向,避免雜亂的輸出
可使用&符號的方法在命令行提示符下同時啓動多個後臺做業 使用ps命令查看全部腳本的運行狀態 在終端會話中使用後臺進程時必定要當心,當退出終端時,後臺進程也會退出
命令格式:nohup ./test1.sh &
命令說明:使用nohup命令在終端會話中啓動shell腳本,並讓腳本一直之後臺模式運行到結束,即便退出了終端會話,shell腳本也會一直運行
執行命令
nohup ./test1.sh & cat nohup.out
說明
使用nohup啓動shell腳本時,腳本會忽略終端會話發過來的SIGHUP信號 因爲nohup命令會解除終端與進程的關聯,進程也就不在同STDOUT和STDERR關聯 nohup命令會自動將STDOUT和STDERR的消息重定向到當前目錄下名爲nohup.out的文件中 若是使用nohup命令運行了另外一個腳本,則該腳本的輸出會被追加到已有的nohup.out文件中
啓動/中止/終止以及恢復做業的這些功能統稱爲做業控制
使用jobs命令查看shell當前正在處理的做業,腳本$$變量顯示Linux系統分配給該腳本的PID
編寫test10.sh腳本
#!/bin/bash # echo "Script Process ID: $$" # count=1 while [ $count -le 10 ] do echo "Loop #$count" sleep 10 count=$[ $count + 1 ] done # echo "End of script..." #
執行命令
./test10.sh > test10.out & 查看做業 jobs 查看做業的PID jobs -l
jobs命令參數
參數:描述 -l:列出進程的PID以及做業號 -n:只列出上次shell發出的通知後改變了狀態的做業 -p:只列出做業的PID -r:只列出運行中的做業 -s:只列出已中止的做業
jobs命令輸出中的加號和減號
帶加號的做業會被當作默認做業 在使用做業控制命令時,若是未在命令行指定任何做業號, 該做業會被當作做業控制命令的操做對象 當前的默認做業完成處理後,帶減號的做業成爲下一個默認做業 任什麼時候候都只有一個帶加號的做業和一個帶減號的做業, 無論shell中有多少個正在運行的做業
命令格式:bg 做業號
命令說明:之後臺模式重啓指定做業
命令格式:fg 做業號
命令說明:之前臺模式重啓指定做業
在多任務操做系統中(Linux就是),內核負責將CPU時間分配給系統上運行的每一個進程 調度優先級是內核分配給進程的CPU時間(相對於其餘進程) 在Linux系統中,由shell啓動的全部進程的調度優先級默認都是相同的 調度優先級是個整數值,從-20(最高優先級)到+19(最低優先級) 默認狀況下,bash shell以優先級0來啓動全部進程
敲門:最低值-20是最高優先級,而最高值19是最低優先級,這太容易記混了。只要記住那句俗語「好人難作」就好了。越是「好」或高的值,得到CPU時間的機會越低
使用nice命令-n參數來指定新的優先級級別
執行命令
nice -n 10 ./test4.sh > test4.out & 查看做業信息 ps -p 3678 -o pid,ppid,ni,cmd nice -10 ./test4.sh > test4.out & ps -p 3706 -o pid,ppid,ni,cmd
使用renice命令指定運行進程PID的優先級
執行命令
./test4.sh & ps -p 3742 -o pid,ppid,ni,cmd renice -n 10 -p 3742 ps -p 3742 -o pid,ppid,ni,cmd
renice命令的一些限制
只能對屬於你的進程執行renice 只能經過renice下降進程的優先級 root用戶能夠經過renice來任意調整進程的優先級
1.at命令的格式
命令格式:at [-f filename] time
命令說明:使用-f參數指定須要執行的腳本文件的文件名,time參數制定了何時運行
多種不一樣的時間格式
標準的小時和分鐘格式,好比10:15 AP/PM指示符,好比10:15PM 特定可命名時間,好比now,noon,midnight或teatime(4PM) 標準日期格式,好比MMDDYY,MM/DD/YY或DD.MM.YY 文本日期,好比Junl4或Dec25,加不加年份都可 也能夠指定時間增量 當前時間+25min 明天10:15PM 10:15+7天
2.獲取做業的輸出
在Linux系統上運行時,顯示器並不會關聯到該做業。Linux系統會將STDOUT或STDERR的輸出經過郵件系統發送給用戶
編寫test13.sh腳本
#!/bin/bash echo "This script ran at $(date +%B%d,%T)" echo sleep 5 echo "This is the script end..."
執行命令
at -f test13.sh now
使用-M選項來屏蔽做業產生的輸出信息
編寫test13b.sh
#!/bin/bash echo "This script ran at $(date +%B%d,%T)" > test13b.out echo >> test13b.out sleep 5 echo "This is the script end..." >> test13b.out
執行命令
at -M -f test13b.sh now cat test13b.out
3.列出等待的做業
atq命令查看系統中有哪些做業在等待,顯示做業列表
做業列表中顯示了做業號,系統運行該做業的日期和時間及其所在的做業隊列
4.刪除做業
命令格式:atrm 做業號
命令說明:使用atrm刪除指定做業
1.cron時間表
命令格式:min hour dayofmonth month dayofweek command
命令說明:cron時間表採用一種特別的格式來指定做業什麼時候運行
格式說明
dayofweek:文本(mon,tue,wed,thu,fri,sat,sun)或數值(0爲週日,6爲週六) dayofmonth:表示月份中的日期值(1~31)
cron實例
在天天的10:15運行一個命令 15 10 * * * command 在每週一4:15PM運行的命令 15 16 * * 1 command 在每月的第一天中午12點執行命令 00 12 1 * * command 在每月的最後一天執行命令 00 12 * * * if [‘date +%d -d tomorrow’ = 01]; then;command 說明:在天天中午12點檢查是否是當月的最後一天,若是是,cron將會運行該命令
執行命令
15 10 * * * /home/zc/test/unit16/test4.sh > test4.out
2.構建cron時間表
Linux提供了 crontab來處理cron時間表,使用cron時間表來運行安排好的任務
命令格式:crontab -l
命令說明:使用crontab -l列出已有的cron時間表
3.瀏覽cron目錄
若是建立的腳本對精確的執行時間要求不高,則可使用預配置的cron腳本目錄
四個基本目錄
hourly:每小時執行 daily:天天執行 monthly:每個月執行 weekly:每週執行
執行命令
ls /etc/cron.*ly
4.anacron程序
cron程序只能保證,Linux系統在開機狀態下,才執行定時做業,當Linux系統處於關機狀態時,並不會去執行定時任務
使用anacron程序,當Linux系統關機,知道某個做業錯過了執行時間,當Linux系統開機時,它會盡快運行做業
anacron程序只會處理位於cron目錄的程序,如/etc/cron.monthly
命令格式:period delay identifier command
命令說明: period定義了做業多久運行一次,以天爲單位。
注意:anacron程序不會處理執行時間小於一天的腳本,如位於/etc/cron.hourly的腳本
每次啓動一個新shell時,bash shell都會運行$HOME/.bashrc文件
驗證
在$HOME/.bashrc文件的最後加入:echo "I'm in a new shell" 而後保存,關閉shell終端 從新打開shell終端時,能夠看見該提示語
本章主要講解了linux中的信號控制,之後臺模式執行腳本,指定時間執行腳本,修改腳本的優先級等。