天天看點

背景執行指令 -- &和nohup

當 我們在終端或控制台工作時,可能不希望由于運作一個作業而占住了螢幕,因為可能還有更重要的事情要做,比如閱讀電子郵件。對于密集通路磁盤的程序,你可能 希望它能夠在每天的非負荷高峰時間段運作。為了使這些程序能夠在背景運作,也就是說不在終端螢幕上運作,有幾種選擇方法可供使用。

在本文中将讨論:

• 設定crontab檔案,并用它來送出作業。

• 使用a t指令來送出作業。

• 在背景送出作業。

• 使用nohup指令送出作業。

名詞解釋:

1、cron,系統排程程序,可以使用它在每天的非高峰負荷時間段運作作業,或在一周或一月中的不同時段運作。

2、 at指令,使用它在一個特定的時間運作一些特殊的作業,或在晚一些的非負荷高峰時間段或高峰負荷時間段運作。

3、 &,使用它在背景運作一個占用時間不長的程序。

4、  nohup 使用它在背景運作一個指令,即使在使用者退出時也不受影響。

& 指令

當在前台運作某個作業時,終端被該作業占據;而在背景運作作業時,它不會占據終端。

可以使用&指令把作業放到背景執行。

該指令的一般形式為:指令&。

為什麼要在背景執行指令?因為當在背景執行指令時,可以繼續使用你的終端做其他事情。适合在背景運作的指令有f i n d、費時的列印作業、費時的排序及一些s h e l l腳本。在背景運作作業時要當心:需要使用者互動的指令不要放在背景執行,因為這樣你的機器就會在那裡傻等。不過,作業在背景運作一樣會将結果輸出到螢幕上,幹擾你的工作。如果放在背景運作的作業會産生大量的輸出,最好使用下面的方法把它的輸出重定向到某個檔案中:

command  >  out.file  2>&1  &

在上面的例子中,所有的标準輸出和錯誤輸出都将被重定向到一個叫做out.file 的檔案中。當你成功地送出程序以後,就會顯示出一個程序号,可以用它來監控該程序,或殺死它。

向背景送出指令:

現在我們運作一個find指令,查找名為“srm.conf”的檔案,并把所有标準輸出和錯誤輸出重定向到一個叫find.dt的檔案中:

find srm.conf > find.dt 2>&1 &

在上面的例子中,在我們成功送出該指令之後,系統給出了它的程序号27015。當該作業完成時,按任意鍵(一般是Enter鍵)就會出現一個提示。

用 ps 指令檢視程序

當一個指令在背景執行的時候,可以用送出指令時所得到的程序号來監控它的運作。在前面的例子中,我們可以按照送出ps1時得到的程序号,用p s指令和g r e p指令列出這個程序:ps –ef | grep ps1,記住,在用p s指令列出程序時,它無法确定該程序是運作在前台還是背景。

殺死背景程序

如果想殺死背景程序可以使用kill指令。當一個程序被放到背景運作時,shell會給出一個程序号,我們可以根據這個程序号,用k i l l指令殺死該程序。該指令的基本形式為:kill -signal [process_number];現在暫且不要考慮其中的各種不同信号;在殺程序的時候,執行下面的指令(你的程序号可能會不同)“kill  29563”并按Enter鍵。系統将會給出相

應的資訊告訴使用者程序已經被殺死。

如果系統沒有給出任何資訊,告訴你程序已經被殺死,那麼不妨等一會兒,也許系統正在殺該程序,如果還沒有回應,就再執行另外一個k i l l指令,這次帶上一個信号選項:15如果用上述方法送出了一個背景程序,那麼在退出時該程序将會被終止。為了使背景程序能夠在退出後繼續運作,可以使用nohup指令,下面我們就介紹這一指令。

nohup 指令

如果你正在運作一個程序,而且你覺得在退出帳戶時該程序還不會結束,那麼可以使用nohup指令,該指令可以在你退出帳戶之後繼續運作相應的程序。nohup就是不挂起的意思( no hang up)。該指令的一般形式為: nohup command &

使用 nohup 指令送出作業

如果使用nohup指令送出作業,那麼在預設情況下該作業的所有輸出都被重定向到一個名為nohup.out的檔案中,除非另外指定了輸出檔案: nohup command > myout.file 2>&1

一次送出幾個作業

如果希望一次送出幾個指令,最好能夠把它們寫入到一個shell腳本檔案中,并用nohup指令來執行它。

小結

本 文中所讨論的工具主要是有關背景運作作業的。有時我們必須要對大檔案進行大量更改,或執行一些複雜的查找,這些工作最好能夠在系統負荷較低時執行。建立一 個定時清理日志檔案或完成其他特殊工作的腳本,這樣隻要送出一次,就可以每天晚上運作,而且無需你幹預,隻要看看相應的腳本日志就可以了。crond和其他工具可以使系統管理任務變得更輕松。

繼續閱讀