nohup讓程序後臺執行

1、要實現守護進程,一種方法是按守護進程的規則去編程(本站有文章介紹過),比較麻煩;另一種方法是仍然用普通方法編程,然後用nohup命令啓動程序:
nohup <程序名> &
則控制檯logout後,進程仍然繼續運行,起到守護進程的作用(雖然它不是嚴格意義上的守護進程)。
使用nohup命令後,原程序的的標準輸出被自動改向到當前目錄下的nohup.out文件,起到了log的作用,實現了完整的守護進程功能。

2、功能:使進程在退出登錄後仍舊繼續執行。

格式:$ nohup <程序名>  &
結果:如果程序program有結果輸出,輸出結果將會被保存到當前目錄下的一個文件名爲 nohup.out的文件中,如果用戶在當前目錄沒有寫的權限, 則結果將會被保存到用戶主目錄下的nohup.out文件中。
舉例:
# nohup ./exp.sh &

nohup: appending output to `nohup.out'

3、如果想要監控標準輸出可以使用:

tail -f nohup.out

4、查看和結束 nohup命令

minis@geek44:~/runtime/test$ ps -aux | grep bp_pro
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
minis     2194  0.4  3.2 2955540 320492 ?      S<l  Jul16   7:49 java -cp bp_pro_crawler-1.0-SNAPSHOT-jar-with-dependencies.jar com.zctech.bp.crawler.JoyopiaoCrawler
minis    23212  0.0  0.0   7816   816 pts/1    S<+  17:08   0:00 grep bp_pro
minis    31971 10.7  1.7 3105572 177484 pts/1  S<l  16:26   4:31 java -cp bp_pro_crawler-1.0-SNAPSHOT-jar-with-dependencies.jar com.zctech.bp.index.SolrIndex

5、下面是一段文字說明:

當用戶啓動一個進程的時候,這個進程是運行在前臺,使用與相應控制終端相聯繫的標準輸入、輸出進行輸入和輸出。即使將進程的輸入輸出重定向,並將進程放在後臺執行,進程仍然和當前終端設備有關係。正因爲如此,在當前的登錄會話結束時,控制終端設備將和登錄進程相脫離,那麼系統就向所有與這個終端相聯繫的進程發送SIGHUP的信號,通知進程線路已經掛起了,如果程序沒有接管這個信號的處理,那麼缺省的反應是進程結束。因此普通的程序並不能真正脫離登錄會話而運行進程,爲了使得在系統登錄後還可以正常執行,只有使用命令nohup來啓動相應程序。

從上面的ps的輸出結果可以看出,有些程序沒有控制終端,這些程序通常是一些後臺進程。使用命令nohup當然可以啓動這樣的程序,但nohup啓動的程序在進程執行完畢就退出,而常見的一些服務進程通常永久的運行在後臺,不向屏幕輸出結果。在Unix中這些永久的後臺進程稱爲守護進程(daemon)。守護進程通常從系統啓動時自動開始執行,系統關閉時才停止。如果偶然某個守護進程消失了,那麼它提供的服務將不再能被使用。

在守護進程中,最重要的一個是超級守護進程inetd,這個進程接管了大部分網絡服務,但並不是對每個服務都自己進行處理,而是依據連接請求,啓動不同的服務程序與客戶機打交道。inetd支持網絡服務種類在它的設置文件/etc/inet.conf中定義。inet.conf文件中的每一行就對應一個端口地址,當inetd接受到連接這個端口的連接請求時,就啓動相應的進程進行處理。使用inetd的好處是系統不必啓動很多守護進程,從而節約了系統資源,然而使用inetd啓動守護進程相應反應會遲緩一些,不適合用於被密集訪問的服務進程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章