腳本控制

  Linux的腳本運行是在外面賦予執行權限,而後再進行運行的。可是這並非惟一一種的運行方式。本章介紹控制shell腳本再系統的運行方式以及運行時間的不一樣方法。shell

一、處理信號

  Linux進程之間的通信使用的就是信號。這些信號包括中止、啓動和終止進程。也能夠經過信號控制腳本運行。後端

  1.一、信號回顧

    Linux和應用程序能夠生成30多個Linux信號,常見信號以下:bash

    默認狀況下,腳本葫蘆收到的任何SIGOUIT(3)和SIGTERM(15)信號。可是會處理任何SIGHUP(1)和SIGINT(2)信號。服務器

    bash shell收到SIGHUP(1)會退出。收到SIGNINT信號,shell當即終端。app

  1.二、生成信號

    一、終斷進程ide

    使用 ctrl+c 生成SIGINIT信號。工具

sleep 100

    二、暫停進程oop

    ctrl + z 生成STGSTP信號。中止進程,進程保留在內存中,可以從中止的地方繼續執行;測試

    使用 ctrl + z 組合鍵以下:spa

    其中[1],1表明做業(job),shell腳本以做爲爲單位在進程中運行,每一個做業都有本身的做業編號;

    此時,經過exit 退出shell的時候,就會提示:There are stopped jobs.

    經過ps查看做業狀態:

    其中 STAT 中 T 表示做業狀態,表示該做業正在被跟蹤或者已經中止;再次輸入exit就能夠中止做業;

    同時,也能夠發送信號9 SIGKILL信號來終止做業;

kill -9 20605

    這樣就直接終止了PID爲20605的進程

  1.三、捕獲信號

    trap命令能夠指定可以經過shell腳本監控和攔截的Linux信號。若是腳本收到trap命中列出的信號,它將保護蓋信號不被shell處理,並在本地處理它。

    trap使用格式:trap commands signals

#!/bin/bash
# testing output in a background job

trap "echo Haha" SIGINT SIGTERM
echo "This is a test program"
count=1
while [ $count -le 10 ]
do
    echo "Loop #$count"
    sleep
    count=$[ $count + 1 ]
done
echo "This is the end of the test program"

    每次使用 ctrl+c 組合監視,腳本執行在trap命令中指定的echo語句,而不是忽略信號並允許shell中止腳本。

  1.四、捕獲腳本退出

    shell腳本退出的時候也能夠捕獲信號。只須要向trap命令添加EXIT信號;

#!/bin/bash
# trapping the script exit

trap "echo byebye" EXIT

count=1
while [ $count -le 5 ]
do
    echo "Loop #$count"
    sleep 3
    count=$[ $count + 1 ]
done

    使用ctrl+c組合鍵發送SIGINT信號,腳本將退出,可是在腳本退出以前,shell將執行trap命令;

  1.五、移除捕獲

    要移除捕獲,使用破折號做爲命令和想要恢復正常行爲的信號列表。

#!/bin/bash
# removing a set trap

trap "echo byebye" EXIT

count=1
while [ $count -le 5 ]
do
    echo "Loop #$count"
    sleep 3
    count=$[ $count + 1 ]
done
trap - EXIT
echo "I just remved the trap"

    腳本正常運行結束,這忽略EXIT信號,可是若是中途ctrl+c終止信號,則已讓裕興EXIT信號;

二、之後臺模式運行腳本

  咱們的進程能夠運行在後臺,然後臺運行進程與STDIN、STDOUT以及STDERR無關;

  如下咱們要介紹如何在Linux系統中之後臺模式運行腳本。

  2.一、之後臺模式運行

    在命令後加上一個 & 符號,就將進程運行到後端了

./test1 &
[1] 19582  #顯示做業號 和進程號

    腳本輸出結果,會與單前運行的命令結果混合在一塊兒,等腳本再後臺執行完成之後,會有有提示:

    [1]+ Done  ./test

    表示後臺進程運行完成;

  2.二、運行多個後臺做業

./test1 &
./test1 &
./test1 &

    能夠經過ps命令查看

  2.三、退出終端

    每一個後臺進程都關聯一個終端會話(pts/0)終端,退出終端會話,就會腿很粗後臺運行的進程;

    通常狀況下,咱們更加但願關閉控制檯,可是後臺進程繼續運行,如何實現呢?

三、不適用控制檯的狀況下運行腳本

    有時須要從終端會話啓動shell腳本,而後讓腳本再結束以前之後臺模式運行,即便退出終端會話也是如此。可使用nohup命令實現;

    nohup命令運行另外一個命令阻塞發送到進程的任何SIGHUP信號。這能夠防止在退出終端會話時退出進程。

$nohup ./test1 &
[1] 19831
$nohup: appending output to 'nohup.out'

    #nohup命令將腳本胡烈任何終端會話發送的SIGHUB信號。由於nohup命令將進程和終端斷開,因此進程沒有STDOUT和STDERR輸出鏈接。爲了接受命令生成的任何輸出,nohup命令自動將STDOOUT和STDERR消息重定向到稱爲nohup.out的文件

    cat nohup.out

四、做業控制

  重啓、中止、終止、恢復做業操做叫作做業控制(job control)。使用做業控制能夠徹底控制進程在shell環境中的運行方式。

  4.一、查看做業

#!/bin/bash
# testing job control

echo "This is a test program $$"  # $$ 變量顯示Linux系統分配給腳本的PID
count=1
while [ $count -le 10 ]
do
    ehco "Loop #$count"
    sleep 10
    count=$[ $count + 1 ]
done
echo "This is the end of the test program"
./test4
./test4 > test4out &
jobs    #經過jobs命令查看後臺運行中止的進程

    jobs命令參數:

    在jobs顯示的內容中:+ 表明默認做業,- 表明當前默認做業結束後將成爲默認做業的做業;

  4.二、從新啓動中止做業

    bg 命令,提供後臺模式中從新啓動做業的功能;

$ bg 2
[2]+ ./test4 &
Loop #2
$ Loop #3
Loop #4

$ jobs

    fg 命令,聽前臺模式下做業從新啓動的功能;

$ jobs
[1]+ Stopped    ./test4
$ fg 1
./test4

五、變得更好

  默認狀況下,shell在CPU上運行的調度優先級(scheduling priority)都相同。調度優先級是內核相對其餘進程分配給某一進程CPU時間量。

  調度優先級從-20(最高)到+20(最低)。默認請看下bash shell啓動全部優先級爲0的進程。

  而 nice 命令則是用來更改進程優先級的。

  5.一、nice命令

    nice -n 選定新的優先級水平:

$ nice -n 10 ./test4 > test4out &
[1] 29476

    增長進程優先級:

$ nice -n -10 ./test4 > test4out &
[1] 29501
$ nice: cannot set priority: Permission denied  #報錯,nice不允許普通用戶增長命令優先級
[1]+ Exit 1          nice -n -10 ./test4 > test4out

  5.二、renice命令

    更改已經在系統中運行的命令優先級。這就須要使用人ice命令。

$./test4 > test4out &
[1] 29504
$ ps al
$ renice 10 -p 29504
$ ps al

    renice的限制:

      一、只能對擁有進程使用renice命令;二、只能使用renice命令將進程調至更低的優先級;三、根用戶可使用renice命令將任何進程調至任何優先級;

六、準確無誤的運行

  指定腳本的預運行時間:一、at命令;二、batch命令;三、cron表格;

  6.一、使用at命令調度做業

    at提交到一個隊列,在後臺運行使用atd命令來完成;

    atd命令其實是檢查/var/spool/at文件,默認60s檢查一次。若是有做業,且與運行時間匹配,則執行;

    一、at命令格式

    at [ -f filename ] time

    time格式:10:15(標準時間)  AM/PM提示符好比 10:15PM  具體時間:now、noon、midnight、teatime(4PM)

    time的日期格式:MMDDYY、MM/DD/YY或者DD.MM.YY  文本日期格式:Jul 4或者Dec 25 沒有年份也能夠   時間增量:Now + 25 minutes 或者 10:15 + 7 days

    at命令會將做業提交到做業列表中等待執行。也可使用 -q 參數有限執行該做業

    二、獲取做業輸出

    將捕獲到的做業輸出,做爲電子郵件發送出來

#!/bin/bash
# testing the at command

time=`date +%T`
echo "This script ran at $time"
echo "This is the end of the script" >&2
at -f test5 12:08
mail
>N 1 rich@testbox Sat Nov 3 12:08 14/474 "Output from your job

    三、列出排隊的做業

    atq 命令可以查看那些做業在排隊

at -f test5 10:15
at -f test5 2007-11-04 10:15
at -f test5 4PM
at -f test5 1PM tomorrow
atq

    四、移除做業

    atrm 命令移除做業

atrm 8  #指定做業號便可
atq

  6.二、使用batch命令

    這個命令是安排腳本再系統使用率低時運行。若是系統處於高負載,batch的做業則會推遲提交。知道系統負載下降;

    batch [ -f filename ] [ time ]

  6.三、調度按期腳本

    crontab 調度列表,按期執行腳本程序。

    一、cron表格

    格式以下:

      min hour dayofmonth month dayofweek command

      dayofweek:mon tue wed thu fri sat sun

      dayofmonth:1-31

      month:1-12

    例如:15 10 * * * command  #10:15

    例如:15 16 * * 1 command  #每週一的16:15

    例如:00 12 1 * * command  #每個月的1號,中午12點

    二、構建cron表格

    crontab -l  #查看錶格內容

    三、anacron程序

    若是使用cron調度做業運行是Linux系統處於關閉狀態,則做業將沒法運行。cron程序沒法在系統打開後從新運行錯過的做業。爲了解決這個問題,許多Linux發行版本提供了anacron程序。

    anacron在系統應爲關機後沒有執行既定的腳本的話,在系統恢復之後,會補上;

    anacron的程序使用給本身的表格,位於/etc/anacrontab中;

    anacron表格格式:

      period delay identifier command

      period:定義做業應該間隔多久運行一次

      delay:指定在anacron程序肯定應該運行一個命令以後須要多久纔會實際運行該命令;

      identifier:爲一個非空字符串,能夠惟一表示日誌消息和錯誤電子郵件中的做業。

七、從頭開始

  讓腳本再Linux系統已啓動或者用戶啓動新的bash shell會話時並自動運行。

  做爲系統管理員,在系統啓動的時候有些操做,在啓動系統的時候就須要執行如下,好比:重置自定義日誌文件或者啓動自定義應用程序等。

  7.一、在啓動時啓動腳本

    在將shell腳本設置爲啓動時自動啓動以前,須要瞭解下Linux啓動過程的工做方式。Linux在啓動時按照必定的順序啓動腳本,瞭解該過程將有助於您讓腳本按照預期的方式運行。

    一、啓動過程

    Linux系統的第一啓動程序 init 程序 /sbin/init 它的進程爲PID 1;

    init程序讀取 /etc/inittab 文件。根據不一樣級別來啓動程序;Linux啓系統的運行級別:

    Linux常見的運行級別是5。而後就是運行級別爲3。

    Linux系統經過rc腳本肯定以哪一種運行級別啓動那些程序。啓動腳本是啓動應用程序的shell腳本,爲運行的程序提供必要的環境的腳本。

    系統腳本程序放在/etc/rc.d目錄中;

     二、定義腳本

    最好不要弄亂Linux髮型版中的任何啓動腳本文件。發行版Linux系統提供了一些工具自動在添加服務器應用程序時構建這些腳本,手動更改這些腳本可能會出現問題。而有一個腳本程序就是用來給用戶指定啓動系統時須要運行的程序的:

  7.二、隨新shell一塊兒啓動

    每一個用戶都包含兩個主目錄文件:

      一、.bash_profile文件

      二、.bashrc文件

    新用戶登陸、在運行新的shell的時候,就會執行.bash_profile文件。該文件中放置任何您但願登陸時運行的腳本。

    每次啓動新的shell時(包括新用戶登陸時)運行.bashrc文件。能夠向主目錄的.bashrc文件添加一個簡單的echo語句,而後啓動一個新shell以測試該特性:

$ bash
This is a new shell!!

    若是是但願每一個用戶都運行這個腳本,則將腳本程序卸載/etc/bashrc文件中;

相關文章
相關標籤/搜索