成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁(yè) > 知識(shí)庫(kù) > shell腳本學(xué)習(xí)指南[五](Arnold Robbins & Nelson H.F. Beebe著)

shell腳本學(xué)習(xí)指南[五](Arnold Robbins & Nelson H.F. Beebe著)

熱門標(biāo)簽:打電話機(jī)器人接我是他的秘書 地圖標(biāo)注員都是年輕人 客服外呼系統(tǒng)怎么樣 揭陽(yáng)智能電話機(jī)器人推薦 如果做線上地圖標(biāo)注 江蘇云電銷機(jī)器人公司 華鋒e路航港口地圖標(biāo)注 百度地圖標(biāo)注錯(cuò)了有責(zé)任嗎 河南信譽(yù)好的不封卡電話外呼系統(tǒng)

作者告訴我們:到目前為止基礎(chǔ)已經(jīng)搞定,可以將前邊所學(xué)結(jié)合shell變成進(jìn)軍中等難度的任務(wù)了。激動(dòng)的要哭了,終于看到本書結(jié)束的曙光了 T T 。碼字比碼代碼還辛苦。不過令人興奮的是立刻就學(xué)以致用了,花了一天半的時(shí)間處理了一個(gè)3.8G的服務(wù)器日志文件,你妹啊,破電腦內(nèi)存才2G。不過切割化小然后寫了幾個(gè)awk文件和sh文件按規(guī)則處理合并,算是搞定了!


第十一章擴(kuò)展實(shí)例:合并用戶數(shù)據(jù)庫(kù)


問題描述就是有兩臺(tái)UNIX的計(jì)算機(jī)系統(tǒng),這兩個(gè)系統(tǒng)現(xiàn)在要合并,用戶群同樣需要合并。有許多用戶兩臺(tái)系統(tǒng)上都有帳號(hào)。現(xiàn)在合并需要的功能是:
將兩個(gè)系統(tǒng)里的/etc/passwd文件合并,并確保來自這兩臺(tái)系統(tǒng)的所有用戶有唯一UID。
針對(duì)已存在的UID、但被用在不同用戶身上的情況,則將其所有文件的所有權(quán)變更為正確用戶。

解決這個(gè)問題,我們程序必須處理的情況可能有這些:
1、用戶在兩個(gè)系統(tǒng)都有用戶名和UID。
2、用戶的用戶名和UID只有一臺(tái)系統(tǒng)里有,另一臺(tái)沒有,這合并時(shí)不會(huì)有問題。
3、用戶在兩臺(tái)系統(tǒng)都有相同的用戶名但UID不同。
4、用戶在兩臺(tái)系統(tǒng)擁有相同UID但用戶名不同。

合并密碼文件幾個(gè)步驟:
1、直接物理合并文件,重復(fù)的username聚在一起,產(chǎn)生結(jié)果為下步輸入。
2、將合并文件分三分:具有相同username和UID的用戶放入unique,未重復(fù)的用戶username也放入。具有相同username但不同UID的放入dupusers,具有相同UID但不同username的放入dupids。
3、建立已使用中具有唯一性的UID編號(hào)列表??捎脕韺ふ倚碌奈词褂肬ID。
4、編寫另一個(gè)程序,搭配使用UID編號(hào)了解,尋找新的UID編號(hào)。
5、建立用以產(chǎn)生最后/etc/passwd記錄的三項(xiàng)組合(username、old UID、new UID)列表。還有最重要的:產(chǎn)生命令,以變更文件系統(tǒng)中文件的所有權(quán)。與此同時(shí),針對(duì)原來就擁有數(shù)個(gè)UID的用戶以及同一UID擁有多個(gè)用戶,建立最后的密碼文件項(xiàng)目。
6、建立最終密碼文件。
7、建立變更文件所有權(quán)的命令列表,并執(zhí)行,這部分要謹(jǐn)慎處理,小心規(guī)劃。

這里書中針對(duì)上述步驟書寫了程序,很大一部分代碼是處理UID的,個(gè)人感覺全部使用新的UID來重新映射username,不是很簡(jiǎn)單就搞定一切了。只用把所有出現(xiàn)的username記錄出來,重復(fù)的干掉,再順序給出對(duì)應(yīng)UID,很簡(jiǎn)單幾步搞定了。至于之后根據(jù)old UID更改文件權(quán)限,完全可以做新舊UID的映射,直接改到新的里邊就OK了。這樣想來如果更改文件權(quán)限是程序主要耗時(shí)部分的話,書中原方法還是可取的,只是編碼復(fù)雜度較高。如果更改權(quán)限耗時(shí)能夠承受,還是選擇編碼復(fù)雜度低的來搞速度還快點(diǎn),也方便。

這里更改文件權(quán)限使用chown命令,可以更改文件擁有用戶或用戶組。-R選項(xiàng)遞歸處理。但出現(xiàn)的問題是用戶擁有的文件未必只放在用戶根目錄里。所以更改用戶在每一個(gè)地方的文件需要使用find命令,從根目錄開始做。類似這樣:
find / -user $user -exec chown $newuid '{}' \;
-exec選項(xiàng)會(huì)針對(duì)每一個(gè)與條件比對(duì)相符的文件執(zhí)行接下來的所有參數(shù),直到分號(hào)為止。find命令里的{}意指替換找到的文件名稱至命令。這樣使用find代碼很高,因?yàn)樗鼤?huì)針對(duì)每一個(gè)文件或目錄建立一個(gè)新的chown進(jìn)程。可以替換成:
find / -user $user -print | xargs chown $newuid
#有GNU工具集可以:
find / -user $user -print0 | xargs --null chown $newuid
這樣就把所有需要更改的文件傳送至一個(gè)新的進(jìn)程來處理,而不是很多個(gè)。

這里有個(gè)另外的問題,加入old-new-list里的數(shù)據(jù)這樣:
juser 25 10
mrwizard 10 30
也就是說如果先變更juser,把juser的文件權(quán)限UID25變更為UID10以后,再變更mrwizard的時(shí)候問題就來了,程序會(huì)把之前所有的juser的文件當(dāng)成mrwizard的文件。這時(shí)就牽扯到處理順序問題,我們必須在25變成10之前,把10變成30。解決方法也簡(jiǎn)單,給所有的UID編號(hào)是沒有任何地方使用過即可。

這里還剩最后一個(gè)小問題,就是find命令尋找用戶的時(shí)候,注意我們問題的環(huán)境,目前是有兩臺(tái)服務(wù)器,find尋找用戶的時(shí)候是有可能找不到另一臺(tái)服務(wù)器用戶的。需要作出處理。

再說一下我們解決這個(gè)問題時(shí)規(guī)避的一些真實(shí)世界的問題。最明顯的是我們很可能也需要合并/etc/group文件。再者,任何一個(gè)大型的系統(tǒng),都可能會(huì)出現(xiàn)文件擁有已不存在于/etc/passwd與/etc/group里的UID或GID值,尋找這里文件可以這樣:
find / '(' -nouser -o -nogroup ')' -ls
這樣做將產(chǎn)生所有這樣的文件輸出??梢允褂霉艿肋M(jìn)一步處理xargs chown...這樣。
第三點(diǎn)是在改變文件的用戶與組處理期間,文件系統(tǒng)絕對(duì)得靜止。處理時(shí)不應(yīng)該有任何其他活動(dòng)發(fā)生,使系統(tǒng)處于單用戶模式下root登錄,且只能在系統(tǒng)物理console設(shè)備上完成這個(gè)任務(wù)。
最后就是效率問題,每個(gè)用戶都需要跑一遍find是很不劃算的,我們可以跑一遍來處理所有用戶的文件,類似這樣:
find / -ls | awk -f make-command.awk old-to-new.txt - > /tmp/commands/sh ... 在執(zhí)行前先檢查 /tmp/commands/sh ... sh / tmp/commands/sh
類似這樣。先讀取old-to-new.txt的舊換新UID變更,然后awk會(huì)針對(duì)每一個(gè)輸出文件尋找是否有必須被更改,如果要更改則使用chown命令。

詳細(xì)代碼之類的略過吧,沒特殊算法,都很簡(jiǎn)單。

第十二章拼寫檢查

最初的unix拼寫檢查原型為代碼說一下:

復(fù)制代碼 代碼如下:

prepare filename |  #刪除格式化命令
  tr A-Z a-z |  #大寫轉(zhuǎn)化為小寫
    tr -c a-z '\n' |  #刪除字母以外字符
       sort  |  uniq |
          comm -13 dictinary -  #報(bào)告不再字典內(nèi)的單詞

comm命令是用以比較兩個(gè)排序后的文件,并選定或拒絕兩個(gè)文件里共同的行。-13選項(xiàng)是僅輸出來自第二個(gè)文件(管道輸入的內(nèi)容)但不在第一個(gè)文件(字典)里的行。-1 不顯示第一列(只在第一個(gè)文件出現(xiàn)的行)-2 不顯示第二列(只在第2個(gè)文件出現(xiàn)的行)-3不顯示第三列(兩個(gè)文件都有的行)。

后續(xù)的有改良的命令ispell和aspell,有一個(gè)不錯(cuò)的功能就是可以提供本地有效的單詞拼寫列表,如:spell +/usr/local/lib/local.words myfile > myfile.errs
針對(duì)所寫文檔提供哦功能私有拼寫字典,非常重要,這能使拼寫檢查更高效準(zhǔn)確。但是spell還有一些棘手的事情,即locale變動(dòng)后會(huì)使命令達(dá)不到預(yù)期效果如:

復(fù)制代碼 代碼如下:

$ env LC_ALL=en_GB spell +ibmsysj.sok ibmsysj.bib | wc -l
   3674
$ env LC_ALL=en_US spell +ibmsysj.sok ibmsysj.bib | wc -l
   3685
$ env LC_ALL=en_C spell +ibmsysj.sok ibmsysj.bib | wc -l
   2163

默認(rèn)的locale在操作系統(tǒng)版本之間可能有所不同。因此最好的方式便是將LC_ALL環(huán)境變量設(shè)置與私人字典排序一致,再執(zhí)行spell。env命令的作用是在重建的環(huán)境中運(yùn)行命令。

書中展現(xiàn)了spell的awk版本,也展現(xiàn)awk的強(qiáng)大。為引導(dǎo)程序進(jìn)行,先列出我們預(yù)期的設(shè)計(jì)目標(biāo):
1、程序?qū)?huì)能夠讀取文字?jǐn)?shù)據(jù)流、隔離單詞、以及報(bào)告不在已知單詞列表的單詞。
2、將會(huì)有一個(gè)默認(rèn)的單詞列表,由一個(gè)或多個(gè)系統(tǒng)字典收集而成。
3、它將可能取代默認(rèn)的單詞列表。
4、標(biāo)準(zhǔn)單詞列表將有可能由一個(gè)或多個(gè)用戶所提供的單詞列表而擴(kuò)增。該列表在技術(shù)性文件上特別有用,例如首字母縮寫、術(shù)語(yǔ)及專有名詞等。
5、單詞列表將無(wú)須排序。
6、雖然默認(rèn)單詞列表都是英文,但輔以適當(dāng)?shù)奶娲詥卧~列表,程序?qū)⒖赡芴幚砣魏握Z(yǔ)言的文字,只要它是以基礎(chǔ)為ASCII的字符集呈現(xiàn),以空白字符分隔單詞。
7、忽略字母大小寫,讓單詞列表維持在易于管理的大小,但異常報(bào)告采用原大小寫。
8、忽略標(biāo)點(diǎn)符號(hào),但頓點(diǎn)符號(hào)(縮寫的撇)將視為字母。
9、默認(rèn)的報(bào)告將為排序后具有獨(dú)一無(wú)二單詞的列表以一行一個(gè)單詞的方式呈現(xiàn)。為拼寫異常列表。
10、將可通過選項(xiàng)增加異常列表報(bào)告,并有位置信息,如文件名行號(hào)等,以利于尋找異常單詞。報(bào)告將以位置排序,且當(dāng)他們?cè)谕晃恢冒l(fā)現(xiàn)多個(gè)異常時(shí),則進(jìn)一步依異常單詞排序。
11、支持用戶可指定的后綴縮寫,讓單詞列表保持在易于管理的大小。

復(fù)制代碼 代碼如下:

#語(yǔ)法:
#   awk [-v Dictionaries="sysdict1 sysdict2 ..."] -f spell.awk -- \
#       [=suffixfile1 =suffixfile2 ...] [+dict1 +dict2 ...] \
#       [-strip] [-verbose] [file(s)]

BEGIN   { initialize() }
        { spell_check_line() }

END     { report_exceptions() }

function get_dictionaries( files, key){
    if((Dictionaries == "") ("DICTIONARIES" in ENVIRON))
        Dictionaries = ENVIRON["DICTIONARIES"]
    if(Dictionaries == ""){ #使用默認(rèn)目錄列表
        DictionaryFiles["/usr/dict/words"]++
        DictionaryFiles["/usr/local/share/dict/words.knuth"]++
    }else{
        split(Dictionaries, files)
        for(key in files)
            DictionaryFiles[files[key]]++
    }  
}

function initialize(){
    NonWordChars = "[^"
        "'" \
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
        "abcdefghijklmnopqrstuvwxyz" \
        "\241\242\243\244\245\246\247\248\249\250" \
        "\251\252\253\254\255\256\257\258\259\260" \
        "\261\262\263\264\265\266\267\268\269\270" \
        "\271\272\273\274\275\276\277\278\279\280" \
        "\281\282\283\284\285\286\287\288\289\290" \
        "\291\292\293\294\295\296\297\298\299\300" \
        "\301\302\303\304\305\306\307\308\309\310" \
        "\311\312\313\314\315\316\317\318\319\320" \
        "\321\322\323\324\325\326\327\328\329\330" \
        "\331\332\333\334\335\336\337\338\339\340" \
        "\341\342\343\344\345\346\347\348\349\350" \
        "\351\352\353\354\355\356\357\358\359\360" \
        "\361\362\363\364\365\366\367\368\369\370" \
        "\371\372\373\374\375\376\377" \
    get_dictionaries()
    scan_options()
    load_dictionaries()
    load_suffixes()
    order_suffixes()
}

function load_dictionaries(file, word){
    for(file in DictionaryFiles){
        while((getline word file) > 0)
            Dictionary[tolower(word)]++
            close(file)
    }
}

function load_suffixes(file, k, line, n, parts){
    if(NSuffixFiles > 0){      #自文件載入后綴正則表達(dá)式
        for(file in SuffixFiles){
            while((getline line  file ) > 0){
                sub(" *#.*$","",line) #截去注釋
                sub("^[ \t]+", "", line) #截去前置空白字符
                sub("[ \t]+$", "", line) #截去結(jié)尾空白字符
                if(line =="") continue
                n = split(line, parts)
                Suffixes[parts[1]]++
                Replacement[parts[1]] = parts[2]
                for(k=3;k=n;k++)
                    Replacement[parts[1]] = Replacement[parts[1]] " " \
                        parts[k]
            }
            close(file)
        }
    }else{  #載入英文后綴正則表達(dá)式的默認(rèn)表格
        split("'$ 's$ ed$ edly$ es$ ing$ ingly$ ly$ s$", parts)
        for(k in parts){
            Suffixes[parts[k]] = 1
            Replacement[parts[k]] = ""
        }
    }
}

function order_suffixes(i, j, key){
    #以遞減的長(zhǎng)度排列后綴
    NOrderedSuffix = 0
    for(key in Suffixes)
        OrderedSuffix[++NOrderedSuffix] = key
    for(i=1;iNOrderedSuffix;i++)
        for(j=i+1;j=NOrderedSuffix;j++)
            if(length(OrderedSuffix[i]) length(OrderedSuffix[j]))
                swap(OrderedSuffix, i, j)
}

function report_exceptions(key, sortpipe){
    sortpipe = Verbose ? "sort -f -t: -u -k1,1 -k2n,2 -k3" : \
                    "sort -f -u -k1"
    for(key in Exception)
        print Exception[key] | sortpipe
    close(sortpipe)
}

function scan_options(k){
    for(k=1;kARGC;k++){
        if(ARGV[k] == "-strip"){
            ARGV[k] = ""
            Strip = 1
        }else if(ARGV[k] == "-verbose"){
            ARGV[k] = ""
            Verbose = 1
        }else if(ARGV[k] ~ /^=/){  #后綴文件
            NSuffixFiles++
            SuffixFiles[substr(ARGV[k], 2)]++
            ARGV[k] = ""
        }else if(ARGV[k] ~ /^[+]/){ #私有字典
            DictionaryFiles[substr(ARGV[k], 2)]++
            ARGV[k] = ""
        }
    }
    #刪除結(jié)尾的空參數(shù)(for nawk)
    while ((ARGC > 0) (ARGV[ARGC-1] == ""))
        ARGC--
}

function spell_check_line(k, word){
    gsub(NonWordChars, "")  #消除非單詞字符
    for(k=1;k=NF;k++){
        word = $k
        sub("^'+","",word)  #截去前置的撇號(hào)字符
        sub("'+$","",word)  #截去結(jié)尾的撇號(hào)字符
        if(word!="")
            spell_check_word(word)
    }
}

function spell_check_word(word, key, lc_word, location, w, wordlist){
    lc_word = tolower(word)
    if(lc_word in Dictionary)   #可接受的拼寫
        return
        else{       #可能的異常
            if(Strip){
                strip_suffixes(lc_word, wordlist)
                for(w in wordlist)
                    if(w in Dictionary) return
            }
            location = Verbose ? (FILENAME ":" FNR ":") : ""
            if(lc_word in Exception)
                Exception[lc_word] = Exception[lc_word] "\n" location word
            else
                Exception[lc_word] = location word
            }
}

function strip_suffixes(word, wordlist, ending, k, n, regexp){
    split("", wordlist)
    for(k=1;k=NOrderedSuffix;k++){
        regexp = OrderedSuffix[k]
        if(match(word, regexp)){
            word = substr(word, 1, RSTART - 1)
            if(Replacement[regexp] == "")
                wordlist[word] = 1
            else{
                split(Replacement[regexp], ending)
                for(n in ending){
                    if(ending[n] =="\"\"")
                        ending[n] = ""
                    wordlist[word ending[n]] = 1
                }
            }
            break
        }
    }
}

function swap(a, i, j, temp){
    temp = a[i]
    a[i] = a[j]
    a[j] = temp
}

又是很長(zhǎng)的代碼,碼的頭暈。。。不保證全對(duì),注釋也先不寫了。執(zhí)行命令:
$ awk -f spell.awk testfile

這里針對(duì)搞算法競(jìng)賽的同學(xué)說一點(diǎn),shell腳本里的高效,怎么樣叫高效,我也是搞競(jìng)賽的,總是追求程序運(yùn)行時(shí)的效率,但是在shell腳本里追求的是總體效率。完成一個(gè)任務(wù)假如編碼時(shí)間用了1個(gè)小時(shí),最終完成的代碼運(yùn)行花30秒鐘,和為了優(yōu)化程序提高運(yùn)行效率而編碼時(shí)間花了2個(gè)小時(shí)乃至更多時(shí)間,最后運(yùn)行代碼時(shí)間縮減,無(wú)論縮減多少,我們都認(rèn)為這個(gè)優(yōu)化還是不太值得肯定的。這里不是否定代碼運(yùn)行效率,而是要平衡這個(gè)編碼時(shí)間。而且shell目前我感覺應(yīng)該是線下運(yùn)行的程序多,不是在線運(yùn)行的程序,所以時(shí)間上的要求可以放寬很多。所以我們要做的就是完成一個(gè)任務(wù)花費(fèi)更少的時(shí)間就好。個(gè)人感覺,不對(duì)了感謝指正。

第十三章進(jìn)程


進(jìn)程是一個(gè)執(zhí)行中程序的一個(gè)實(shí)例,新進(jìn)程由fork()與execve()等系統(tǒng)調(diào)用所起始執(zhí)行直到exit()為止。進(jìn)程會(huì)被指定優(yōu)先權(quán),nice和renice命令用于調(diào)整進(jìn)程的優(yōu)先權(quán)。任何瞬間,等待執(zhí)行之進(jìn)程的平均數(shù),被成為平均負(fù)載,uptime命令可顯示。
列出進(jìn)程狀態(tài)的命令是ps(process status)。System V形式下:ps -efl顯示更多信息,BSD形式是ps aux 。進(jìn)程列表是動(dòng)態(tài)的,如果想觀察動(dòng)態(tài)的,可以使用top命令。

shell程序處理下一個(gè)命令之前會(huì)等待前一條命令結(jié)束,但是在命令最后加入可以使其在后臺(tái)運(yùn)行,便可不用等待上一個(gè)命令了。wait命令可以用來等待某個(gè)特定進(jìn)程完成,在不加任何參數(shù)情況下,則為等待所有后臺(tái)進(jìn)程完成。另外控制的還有bg、fg、jobs等都處理目前shell下所建立的執(zhí)行中的進(jìn)程。

有4組鍵盤字符可用以中斷前臺(tái)進(jìn)程,這些字符可通過stty命令選項(xiàng)而設(shè)置。一般是Ctrl-C(intr:殺除)、Ctrl-Y(dsusp:暫時(shí)擱置,直到輸入更新為止)、Ctrl-Z(susp:暫時(shí)擱置),與Ctrl-\(quit:以核心存儲(chǔ)方式殺除)。

用上邊的幾個(gè)命令實(shí)現(xiàn)一個(gè)簡(jiǎn)單的top命令:

復(fù)制代碼 代碼如下:

#! /bin/sh -
# 持續(xù)執(zhí)行ps命令,每次顯示之間,只作短時(shí)間的暫停
#
# 語(yǔ)法:
#       simple-top
IFS='
    '
#自定PATH,以先取得BSD式的ps
PATH=/usr/ucb:/usr/bin:/bin
export PATH

HEADFLAGS="-n 20"
PSFLAGS=aux
SLEEPFLAGS=2
SORTFLAGS='-k3nr -k1,1 -k2n'

HEADER="`ps $PSFLAGS | head -n 1 `"

while true
do
    clear
    uptime
    echo "$HEADER"
    ps $PSFLAGS | sed -e 1d | sort $SORTFLAGS | head $HEADFLAGS
    sleep $SLEEPFLAGS
done

再實(shí)現(xiàn)一個(gè)針對(duì)user查詢的腳本:

復(fù)制代碼 代碼如下:

#! /bin/sh -
# 顯示用戶及其活動(dòng)中的進(jìn)程數(shù)和進(jìn)程名稱
# 可選擇性限制顯示某些特定用戶
# 語(yǔ)法:
#       puser [ user1 ... ]
IFS='
    '
PATH=/usr/local/bin:/usr/bin:/bin
export PATH
EGREPFLAGS=
while test $# -gt 0
do
    if test -z "$EGREPFLAGS"
    then
        EGREPFLAGS="$1"
    else
        EGREPFLAGS="$EGREPFLAGS|$1"
    fi 
    shift
done

if test -z "$EGREPFLAGS"
then
    EGREPFLAGS="."
else
    EGREPFLAGS="^ *($EGREPFLAGS) "
fi

case "`uname -s`" in
*BSD | Darwin ) PSFLAGS="-a -e -o user,ucomm -x" ;;
* )             PSFLAGS="-e -o user,comm" ;;
esac

ps $PSFLAGS | sed -e 1d |
    EGREP_OPTIONS= egrep "$EGREPFLAGS" |
        sort -b -k1,1 -k2,2 | uniq -c |
            sort -b -k2,2 -k1nr,1 -k3,3 |
                awk '{
                    user = (LAST == $2)?" " : $2
                    LAST = $2
                    printf("%-15s\t%2d\t%s\n",user,$1,$3)
                }'

內(nèi)容都很簡(jiǎn)單,不再贅述注釋。

進(jìn)程列表有了,如何控制或者刪除某一個(gè)進(jìn)程呢。之前有說exit()能讓進(jìn)程終止,但有時(shí)候我們會(huì)提前終止,這時(shí)我們需要kill命令。kill命令會(huì)傳送信號(hào)(signal)給指定的執(zhí)行程序,不過它有兩個(gè)例外,稍后提到。進(jìn)程接到信號(hào),并處理之,有時(shí)可能直接選擇忽略它們。只有進(jìn)程擁有者或root、內(nèi)核、進(jìn)程本身可以傳送信號(hào)給它。但是接收信號(hào)的進(jìn)程本身無(wú)法判斷信號(hào)從何而來。不同的系統(tǒng)支持不同的信號(hào)類型,你可以通過kill -l 來列出你當(dāng)前使用的系統(tǒng)支持的信號(hào)類型。每個(gè)處理信號(hào)的程序都可以自由決定如何解決接到的這些信號(hào)。信號(hào)名稱反應(yīng)的是慣用性(conventions),而非必須性(requirement),所以對(duì)不同的程序而言,信號(hào)所表示的意義也會(huì)稍有不同。

kill pid 就可以直接終止進(jìn)程??刂七M(jìn)程的話,就使用剛才kill -l羅列出來的進(jìn)程信號(hào),用法:kill[-ssignal|-p][-a]pid... 需要自行了解自己系統(tǒng)的進(jìn)程信號(hào)。比如:

復(fù)制代碼 代碼如下:

$ kill -STOP 17787 #終止進(jìn)程
$ sleep 36000 kill -CONT 17787 #十小時(shí)后恢復(fù)

刪除進(jìn)程必須直到四個(gè)信號(hào):ABRT(中斷)、HUP(擱置)、KILL、TERM(終結(jié))。不同系統(tǒng)有所不同貌似,可以查看一下,名字應(yīng)該類似:
kill -l | grep -e "KILL\|BRT\|HUP\|TERM"

有些程序會(huì)在結(jié)束前做些清理工作,一般TERM信號(hào)解釋為“快速清理并結(jié)束”,如果未指定信號(hào),默認(rèn)的kill會(huì)傳送此信號(hào)。ABRT類似TERM它會(huì)抑制清除操作,并產(chǎn)生進(jìn)程內(nèi)的影像的副本。HUP類似要求中止,時(shí)常表示進(jìn)程應(yīng)該先停止正在處理的事情,然后準(zhǔn)備處理新工作。有兩個(gè)進(jìn)程沒有任何進(jìn)程可以忽略的:KILL和STOP,這兩個(gè)信號(hào)一定會(huì)立刻被傳送,但是也有特例情況,根據(jù)實(shí)際情況也可能會(huì)被延時(shí)的。不同系統(tǒng)平臺(tái)有差異。

小心使用這些終止命令。當(dāng)程序非正常中止,都可能在文件系統(tǒng)留下殘余數(shù)據(jù),這些殘余數(shù)據(jù)除了浪費(fèi)空間,還可能導(dǎo)致下次執(zhí)行程序發(fā)生問題。比如:daemon、郵件客戶端程序、文字編輯器、以及網(wǎng)頁(yè)瀏覽器都會(huì)產(chǎn)生鎖定(lock)。如果程序第二實(shí)例被啟動(dòng),而第一實(shí)例仍在執(zhí)行時(shí),第二個(gè)實(shí)例會(huì)偵測(cè)到已存在的lock,回報(bào)該事實(shí)并立即中止。最糟糕的是,這些程序很少會(huì)告訴你lock文件的文件名,并很少將它寫入文件里。如果該lock文件長(zhǎng)期執(zhí)行進(jìn)程的殘余數(shù)據(jù),你可能發(fā)現(xiàn)程序無(wú)法執(zhí)行,直到你找到lock并刪除為止。

有的系統(tǒng)提供pgrep和pkill。它們能根據(jù)進(jìn)程名稱結(jié)束進(jìn)程,詳細(xì)自行看manual。

關(guān)于捕捉進(jìn)程信號(hào)。進(jìn)程會(huì)向內(nèi)核注冊(cè)哪些它們想要處理的信號(hào)。它們標(biāo)明在signal()程序庫(kù)調(diào)用的參數(shù)里。man -a signal 可以查看所有關(guān)于信號(hào)的manual。trap可引起shell注冊(cè)信號(hào)處理器(signal handler),抓取指定的信號(hào)。trap取得一個(gè)字符串參數(shù),其包含采取捕捉時(shí)要被執(zhí)行的命令列表,緊接著一個(gè)要設(shè)置捕捉的信號(hào)列表。

下邊展示一個(gè)小型shell腳本:looper,它的功能是使用trap命令,說明被抓?。╟aught)與未被抓取的信號(hào)。

復(fù)制代碼 代碼如下:

#! /bin/sh -

trap 'echo Ignoring HUP ... ' HUP
trap 'echo Terminating on USR1 ... ; exit 1 ' USR1

while true
do
    sleep 2
    date >/dev/null
done
]

$ looper #運(yùn)行這個(gè)腳本于后臺(tái)
[1] 24179
$ kill -HUP 24179
Ignoring HUP ...
$ kill -USR1 24179
Terminating on USR1 ...
[1]+Done(1)

其他進(jìn)程控制命令自行測(cè)試,或者搜文章學(xué)習(xí)。后邊又講了一些進(jìn)程的日志。

進(jìn)程延遲。sleep命令暫停執(zhí)行一段時(shí)間后喚醒。at是延遲至特定時(shí)間,這個(gè)命令在不同系統(tǒng)有差異,但下列例子普遍適用:
at 21:00 #晚上9點(diǎn)執(zhí)行
at now #立刻執(zhí)行
at now + 10 minutes #10分鐘后執(zhí)行
at now + 8 hours
at 0400 tomorrow #明天早上4點(diǎn)執(zhí)行
at 14 July
at noon + 15 minutes #今天下午12:15執(zhí)行
at teatime #下午16:00執(zhí)行
at允許相當(dāng)復(fù)雜的時(shí)間指定 。接受HH:MM的時(shí)間式樣,如果時(shí)間過了則為第二天這個(gè)時(shí)間。midnight是午夜,noon中午,teatime下午4點(diǎn),也可以適用AM或PM后綴指定上下午,也可以month-name dat加上可選的年份式樣來指定日期,或者給出MMDDYY、MM/DD/YY或DD.MM.YY來執(zhí)行日期。日期單位有minutes hours days weeks ,還有today、tomorrow。

atq命令列出at隊(duì)列里的所有工作,而atrm則是刪除它們。batch在系統(tǒng)負(fù)載水平允許的時(shí)候執(zhí)行命令,換句話說當(dāng)平均負(fù)載低于0.8或降到了在atrun文件中指定的期望值時(shí)運(yùn)行。

大部分計(jì)算機(jī)有許多管理工作需要重復(fù)執(zhí)行,像每晚文件系統(tǒng)備份之類的。crontab命令可在指定的時(shí)間執(zhí)行工作,其包括了系統(tǒng)啟動(dòng)時(shí)起始的cron daemon。crontab -l 列出你目前工作調(diào)度,以crontab -e啟動(dòng)編輯器更新調(diào)度。編輯器的選擇根據(jù)EDITOR環(huán)境變量而定,有些計(jì)算機(jī)會(huì)因?yàn)槲丛O(shè)置此參數(shù)而拒絕執(zhí)行crontab。crontab適用的調(diào)度參數(shù):

復(fù)制代碼 代碼如下:

mm    hh      dd     non    weekday command
00-59 00-23 01-31 01-12 0-6(0=Sunday)

前5欄除了使用單一數(shù)字外,還可以搭配連字符分隔,指出一段區(qū)間,或者使用逗點(diǎn)分隔數(shù)字列表或區(qū)間。還可以使用星號(hào),指該字段所有可能數(shù)字。范例:
15 * * * * command # 每個(gè)小時(shí)的第15分鐘執(zhí)行
0 2 1 * * command # 每個(gè)月一開始的02:00執(zhí)行
0 8 1 1,7 * command # 每個(gè)一月一日與七月一日的08:00執(zhí)行
0 6 * * 1 command # 每周一06:00執(zhí)行
0 8-17 * * 0,6 command # 每周末的08:00到17:00間一小時(shí)執(zhí)行一次
在command可以詳細(xì)指出要執(zhí)行的文件或重新設(shè)定要執(zhí)行文件的查找路徑:
0 4 * * * /usr/local/bin/updatedb
0 4 * * * PATH=/usr/local/bin:$PATH updatedb
任何出現(xiàn)在標(biāo)準(zhǔn)錯(cuò)誤輸出或標(biāo)準(zhǔn)輸出上的數(shù)據(jù)都會(huì)顯示給你,或是在其他實(shí)例中,將會(huì)寄到MAILTO變量的值所指定的用戶。實(shí)物上通常會(huì)比較傾向與將輸出重導(dǎo)至一個(gè)日志文件,并累積連續(xù)執(zhí)行的記錄:
55 23 * * * $HOME/bin/daily >> $HOME/logs/daily.log 2>1
這樣日志文件會(huì)過大,一般可以加上日期:
55 23 * * * $HOME/bin/daily > $HOME/logs/daily.`date +\%Y.\%m.\%d`.log 2>1
這樣時(shí)間長(zhǎng)了文件會(huì)過多,你可以輕松刪除或壓縮這些文件:
find $HOME/logs/*.log -ctime +31 | xargs bzip2 -9 #壓縮一個(gè)月前的日志文件
find $HOME/logs/*.log -ctime +31 | xargs rm #刪除一個(gè)月前的日志文件
這里小心crontab -r 將crontab文件整個(gè)刪除。它就像rm一樣無(wú)法撤回,也無(wú)法復(fù)原。建議保留備份:
crontab -l > $HOME/.crontab.`hostname` #存儲(chǔ)現(xiàn)行的crontab
恢復(fù)的時(shí)候:
crontab $HOME/.crontab.`hostname` #回復(fù)存儲(chǔ)的crontab
就像at命令那樣,系統(tǒng)目錄里也有cron.allow與cron.deny文件,用以控制是否允許cron工作,以及誰(shuí)可以執(zhí)行它們。

最后講了一下/proc文件系統(tǒng),大概意思是每個(gè)子進(jìn)程在那里有個(gè)目錄用進(jìn)程ID命令。

您可能感興趣的文章:
  • shell腳本學(xué)習(xí)指南[二](Arnold Robbins & Nelson H.F. Beebe著)
  • shell腳本學(xué)習(xí)指南[一](Arnold Robbins & Nelson H.F. Beebe著)
  • shell腳本學(xué)習(xí)指南[六](Arnold Robbins & Nelson H.F. Beebe著)
  • shell腳本學(xué)習(xí)指南[四](Arnold Robbins & Nelson H.F. Beebe著)
  • shell腳本學(xué)習(xí)指南[三](Arnold Robbins & Nelson H.F. Beebe著)

標(biāo)簽:巴彥淖爾 邵陽(yáng) 許昌 赤峰 馬鞍山 金昌 淘寶邀評(píng) 婁底

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《shell腳本學(xué)習(xí)指南[五](Arnold Robbins & Nelson H.F. Beebe著)》,本文關(guān)鍵詞  shell,腳本,學(xué)習(xí)指南,五,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《shell腳本學(xué)習(xí)指南[五](Arnold Robbins & Nelson H.F. Beebe著)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于shell腳本學(xué)習(xí)指南[五](Arnold Robbins & Nelson H.F. Beebe著)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美成人亚洲| 国产精品88888| 婷婷丁香综合| 黄网站免费观看| 亚洲av无码国产精品久久不卡| 精精国产xxxx视频在线播放| 国产一二三在线观看| 亚州欧美在线| 狠狠色狠狠色合久久伊人| 黄色小视频免费看| 久久久视频在线| 国产美女福利视频| 91精品国产一区二区在线观看| 国产精品刘玥久久一区| 国产伦精品一区二区三区高清版禁| 国产又粗又猛又色| 免费av网站大全久久| 国产亚洲欧美一区在线观看| 国产午夜精品一区二区| 26uuu成人网| 亚洲第一视频网| 欧美精选一区二区| 亚洲永久免费视频| 久久国产在线视频| 91在线播放视频| 欧美日韩精品在线一区| 欧美一卡在线观看| 日本不卡久久| 黄色三级网站在线观看| 洋洋成人永久网站入口| 1069男同网址| 日韩精品极品毛片系列视频| 中文字幕一区二区三区人妻四季| 一区二区三区|亚洲午夜| 天堂网www在线观看| 国产精品6666| 91麻豆精品成人一区二区| 成人免费在线电影| 亚洲精品www.| 欧洲亚洲国产日韩| 福利片一区二区三区| 福利在线免费视频| 在线观看视频亚洲| 久久香蕉综合色一综合色88| 午夜视频在线免费| 国产一区二区黄| 国产三区在线视频| 天天操天天擦| 偷偷色噜狠狠狠狠的777米奇| 亚洲另类在线制服丝袜| 超碰97国产精品人人cao| re久久精品视频| 狂野欧美性猛交xxxx| 在线观看国产精品入口| 91久久久久国产一区二区| 捆绑裸体绳奴bdsm亚洲| 五月婷六月丁香| 精品国产亚洲一区二区在线观看| 久久国产美女视频| 成人片在线播放| 亚洲一区精彩视频| 一区二区激情| 欧美人与z0zoxxxx特| 最新精品视频| 神马一区二区三区| 国产毛片视频| 操人在线观看| 国产91在线免费| 最新四虎影在线在永久观看www| 欧美一区二区三区爽大粗免费| 成人黄色国产精品网站大全在线免费观看| 在线观看欧美精品| 国产精品久久久久久久久免费看| 国产精品一二三区视频| 秋霞影院午夜丰满少妇在线视频| 在线国产伦理一区| 黑人巨大精品一区二区在线| 我家有个日本女人| 色诱女教师一区二区三区| 久久综合久久88| 全球成人中文在线| 欧美午夜不卡影院在线观看完整版免费| 精品电影一区| 亚洲天堂网av在线| 亚洲另类春色国产| 国产精品成人午夜| 免费黄色电影在线观看| 都市激情国产精品| 日本在线视频www色| 久热在线观看视频| 国产又大又黄又猛| 视频污在线观看| 欧美性猛交xxxx免费看久久久| 久久久精品免费观看| 欧美限制电影| 91成人在线播放| 黄网站app在线观看| 国产一区二区三区中文字幕| 久久精品免费一区二区三区| 国产成人午夜| 少妇精品在线| 精品一区二区久久久久久久网站| 欧美性生交xxxxx| 亚洲 美腿 欧美 偷拍| 亚洲图片小说视频| 国产真乱mangent| 欧美精品久久久久久久免费| 宅男一区二区三区| 麻豆国产91在线播放| 亚洲青青青在线视频| 国产精品无码免费专区午夜| 欧美色爱综合网| 免费91在线观看| 精品国产乱码久久久久久久软件| 理论片一区二区在线| 丰满白嫩尤物一区二区| 一本色道久久综合亚洲91| 国产精品欧美一区喷水| 97国产精品久久久| 欧美日韩国产免费一区二区三区| 91香蕉国产视频| 亚洲欧美中日韩| 一区二区欧美在线| 亚洲高清激情| 五月婷婷亚洲| 亚洲综合日韩| 中国色在线观看另类| 4kfree性满足欧美hd18| 久久久久久久久艹| 亚洲新中文字幕| 成人高清在线视频| 亚洲自拍一区在线观看| 国产免费一区二区三区免费视频| 亚洲 欧洲 日韩| 一本一道波多野毛片中文在线| yourporn在线观看视频| 国产成人禁片免费观看| 亚洲色成人网站www永久四虎| 国产欧美一区二区精品性| 特级丰满少妇一级| 国产又粗又猛又爽又黄的视频小说| 99re这里只有精品6| 日韩欧美一区二区三区不卡视频| 九色成人搞黄网站| 97人人模人人爽人人少妇| 精品久久亚洲一级α| 中文在线播放一区二区| 91亚洲国产成人久久精品网站| 韩国三级丰满少妇高潮| 国产一级淫片免费| 一区一区三区| 佐山爱痴汉视频一区二区三区| 亚洲高清在线不卡| 国产欧美欧洲在线观看| 成人一区二区av| 亚洲а∨天堂久久精品2021| 一区二区三欧美| 国产色婷婷国产综合在线理论片a| 欧美一区二区三区免费看| 亚洲天堂视频在线观看免费| 国产精品日韩高清| 欧美日韩在线视频一区二区三区| 欧美一区二区三区在线观看| 26uuu亚洲国产精品| 欧美日韩在线播| 国产综合免费视频| 亚洲字幕成人中文在线观看| 亚洲精品动漫| 免费看黄色的网站| 中文字幕先锋av影音资源网| www.eeuss影院| 四虎国产成人精品免费一女五男| 亚洲国产日韩美| 男女激情视频一区| 亚洲欧美99| 免费毛片在线播放| 国产精品一久久香蕉国产线看观看| 成人在线免费看片| 又爽又黄的午夜网站| 国产在线观看免费av| 天天操天天综合网| 国产视频精选在线| 四虎永久在线观看| 99精品视频免费在线观看| 天堂一区在线观看| 午夜免费日韩视频| 91久久精品日日躁夜夜躁国产| 2019中文字幕全在线观看| 伊人网综合在线| 国产成人精品一区二区无码呦| 亚洲国产私拍精品国模在线观看| 色999日韩自偷自拍美女| 中文人妻一区二区三区| 91av手机在线| 亚洲精品成人区在线观看| 春色校园综合激情亚洲| av大全在线| 国产综合视频在线| 国产视频精品网| 天堂网一区二区三区| 亚洲深夜福利在线观看| brazzers精品成人一区| 日韩图片一区| 第一福利在线视频| 精品日韩欧美一区二区| 欧美日韩视频免费| 日本一区二区免费高清视频| 色偷偷色偷偷色偷偷在线视频| 性生活免费在线观看| 亚洲综合av在线播放| 欧美一区二区三区在线| av白虎一区| 亚洲裸体俱乐部裸体舞表演av| 国产极品嫩模在线视频一区| eeuss影院在线观看第一页| 日本高清视色| 免费人成在线观看播放视频| 中国人体摄影一区二区三区| 中文在线免费| 欧美日韩中国免费专区在线看| 丝袜美腿一区二区三区| 超黄网站在线观看| 182在线观看视频| 国产精品嫩草影院俄罗斯| 十九岁完整版在线观看好看云免费| 国模精品一区二区三区| missav|免费高清av在线看| 日韩中文综合网| 男人的天堂va| 亚洲欧美视频在线播放| 久久99精品波多结衣一区| 国产不卡av在线播放| 亚洲激情免费视频| 88xx成人免费观看视频库| av资源站久久亚洲| 亚洲成色最大综合在线| 老司机福利av| а天堂8中文最新版在线官网| 色就是色欧美| 深夜福利av| 69**夜色精品国产69乱| av每日在线更新| 综合久久国产| 人偷久久久久久久偷女厕| 天天爱天天操天天干| 亚洲狠狠丁香婷婷综合久久久| 日本欧美一区二区在线观看| 免费黄色电影在线观看| 国产欧美精品一区二区色综合朱莉| 亚洲肉体裸体xxxx137| 99精品视频中文字幕| 97国产在线视频| 一色桃子一区二区| 久久黄色免费网站| 精品视频网站| 黑人另类av| 久久一本综合| 色国产在线视频| 欧美日免费三级在线| 黄色免费成人| 日韩理论片在线观看| 欧美成人三级在线视频| 久久免费在线观看视频| 久久福利毛片| 亚州av日韩av| 亚洲自拍一区在线观看| √8天堂资源地址中文在线| 美国av在线播放| 岛国精品一区二区| 99re久久最新地址获取| 美国av一区二区| 久久高清一区| 久久亚洲精华国产精华液| 欧美日韩xx| 性欧美videos精品| 亚洲人成色777777精品音频| 欧美日本在线播放| 九一免费在线观看| 欧美性色视频在线| 天堂网视频在线观看| 色婷婷av一区二区三区丝袜美腿| 精品av综合导航| 日韩mv欧美mv国产网站| 精品国产免费人成电影在线观...| 国产精品亚洲色图| 中文字幕不卡三区视频| 亚洲欧美经典视频| 日本老妇乱子| 日韩精品视频在线播放| 日韩免费一级视频| 国产一级一片免费播放| 91gao视频| 久久精品国产99精品国产亚洲性色| 激情成人综合| 糖心vlog精品一区二区| av最新地址| videos性欧美另类高清| 400部精品国偷自产在线观看| 国产精品亚洲欧美在线播放| 国产精品99久久精品| 亚洲国产成人私人影院| 亚洲精品20p| 国产成人a人亚洲精品无码| 91影院在线观看| 一级毛片免费高清中文字幕久久网| 中文字幕综合| 第四色中文综合网| 久久久久青草大香线综合精品| 一区中文字幕在线观看| 黄色福利视频网站| 国产精品毛片一区二区三区| 毛片网站在线看| 亚洲一区二区三区网站| 欧美日韩国产免费观看| 日日摸.com| 日韩欧美一区二区三区久久| 国产成人在线视频免费播放| 一区二区精品国产| 亚洲色欲久久久综合网东京热| 91高清免费看| 欧美美女一区二区三区| 久久精品性爱视频| 精品久久久久中文字幕小说| 羞羞的网站在线观看| 亚洲深夜福利视频| 羞羞视频网站在线免费观看| 伊人成综合网伊人222| 美女色狠狠久久|