在linux系統下如何使一個程序在后台一直執行呢?很多人使用&結尾的命令形式,但是如果沒有守護進程的話,即使這樣,在終端關閉時程序也會終止運行。這時候就得使用nohup命令了。
例如,如果在終端中執行java -jar xxx.jar&命令,當終端關閉時,xxx.jar也會同時結束運行,但是如果執行nohup java -jar xxx.jar&命令,則程序會在后台一直運行,值得注意的是,此時程序控制台輸出會被轉移到nohup.out文件中。
附:nohup命令參考 nohup 命令
用途:不掛斷地運行命令。
語法:nohup Command [ Arg ... ] [ & ]
描述:nohup 命令運行由 Command 參數和任何相關的 Arg 參數指定的命令,忽略所有掛斷(SIGHUP)信號。在注銷后使用 nohup 命令運行后台中的程序。要運行后台中的 nohup 命令,添加 & ( 表示"and"的符號)到命令的尾部。
無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 nohup.out 文件中。如果當前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out 文件中。如果沒有文件能創建或打開以用於追加,那么 Command 參數指定的命令不可調用。如果標准錯誤是一個終端,那么把指定的命令寫給標准錯誤的所有輸出作為標准輸出重定向到相同的文件描述符。
如需要了解窗口關閉導致運行進程關閉的原因:請參看下面的具體分析
你是不是經常需要遠程登錄到Linux服務器?你是不是經常為一些長時間運行的任務頭疼?還在用 nohup 嗎?那么來看看 screen 吧,它會給你一個驚喜! 你是不是經常需要 SSH 或者 telent 遠程登錄到 Linux 服務器?你是不是經常為一些長時間運行的任務而頭疼,比如系統備份、ftp 傳輸等等。通常情況下我們都是為每一個這樣的任務開一個遠程終端窗口,因為他們執行的時間太長了。必須等待它執行完畢,在此期間可不能關掉窗口或者斷開連接,否則這個任務就會被殺掉,一切半途而廢了。
【原因所在】
元凶:SIGHUP 信號 讓我們來看看為什么關掉窗口/斷開連接會使得正在運行的程序死掉。 在Linux/Unix中,有這樣幾個概念:
- 進程組(process group):一個或多個進程的集合,每一個進程組有唯一一個進程組ID,即進程組長進程的ID。
- 會話期(session):一個或多個進程組的集合,有唯一一個會話期首進程(session leader)。會話期ID為首進程的ID。
- 會話期可以有一個單獨的控制終端(controlling terminal)。與控制終端連接的會話期首進程叫做控制進程(controlling process)。當前與終端交互的進程稱為前台進程組。其余進程組稱為后台進程組。
根據POSIX.1定義: 掛斷信號(SIGHUP)默認的動作是終止程序。 當終端接口檢測到網絡連接斷開,將掛斷信號發送給控制進程(會話期首進程)。 如果會話期首進程終止,則該信號發送到該會話期前台進程組。
一個進程退出導致一個孤兒進程組中產生時,如果任意一個孤兒進程組進程處於STOP狀態,發送SIGHUP和SIGCONT信號到該進程組中所有進程。 因此當網絡斷開或終端窗口關閉后,控制進程收到SIGHUP信號退出,會導致該會話期內其他進程退出。 我們來看一個例子。打開兩個SSH終端窗口,在其中一個運行top命令。 在另一個終端窗口,找到top的進程ID為5180,其父進程ID為5128,即登錄shell。 使用pstree命令可以更清楚地看到這個關系: 使用ps-xj命令可以看到,登錄shell(PID 5128)和top在同一個會話期,shell為會話期首進程,所在進程組PGID為5128,top所在進程組PGID為5180,為前台進程組。 關閉第一個SSH窗口,在另一個窗口中可以看到top也被殺掉了。
(其實,對於windows控制台程序,也是類似的。在一個控制台窗口中運行一個非service程序,那么控制台窗口自然是該窗口中運行程序的父進程,當父進程關閉時,默認由其創建的子進程會被kill掉。當然,應該也有機制創建類似unix的后台進程。。。)
【基礎回避方法】 如果我們可以忽略SIGHUP信號,關掉窗口應該就不會影響程序的運行了。nohup命令可以達到這個目的,如果程序的標准輸出/標准錯誤是終端,nohup默認將其重定向到nohup.out文件。值得注意的是nohup命令只是使得程序忽略SIGHUP信號,還需要使用標記 & 把它放在后台運行。
【高級回避方法】
雖然nohup很容易使用,但還是比較"簡陋"的,對於簡單的命令能夠應付過來,對於復雜的需要人機交互的任務就麻煩了。 其實我們可以使用一個更為強大的實用程序screen。流行的Linux發行版(例如Red Hat Enterprise Linux 4)通常會自帶screen實用程序,如果沒有的話,可以從GNU screen的官方網站下載。
開始使用Screen
簡單來說,Screen是一個可以在多個進程之間多路復用一個物理終端的窗口管理器。Screen中有會話的概念,用戶可以在一個screen會話中創建多個screen窗口,在每一個screen窗口中就像操作一個真實的telnet/SSH連接窗口那樣。在screen中創建一個新的窗口有這樣幾種方式:
1.直接在命令行鍵入screen命令
Screen將創建一個執行shell的全屏窗口。你可以執行任意shell程序,就像在ssh窗口中那樣。在該窗口中鍵入exit退出該窗口,如果這是該screen會話的唯一窗口,該screen會話退出,否則screen自動切換到前一個窗口。
2.Screen命令后跟你要執行的程序。
Screen創建一個執行vi
test.c的單窗口會話,退出vi將退出該窗口/會話。
3.以上兩種方式都創建新的screen會話。我們還可以在一個已有screen會話中創建新的窗口。在當前screen窗口中鍵入C-a
c,即Ctrl鍵+a鍵,之后再按下c鍵,screen
在該會話內生成一個新的窗口並切換到該窗口。
screen還有更高級的功能。你可以不中斷screen窗口中程序的運行而暫時斷開(detach)screen會話,並在隨后時間重新連接(attach)該會話,重新控制各窗口中運行的程序。例如,我們打開一個screen窗口編輯/tmp/abc文件:
之后我們想暫時退出做點別的事情,比如出去散散步,那么在screen窗口鍵入C-a
d,Screen會給出detached提示:
半個小時之后回來了,找到該screen會話:
重新連接會話:
看看出現什么了,太棒了,一切都在。繼續干吧。
你可能注意到給screen發送命令使用了特殊的鍵組合C-a。這是因為我們在鍵盤上鍵入的信息是直接發送給當前screen窗口,必須用其他方式向screen窗口管理器發出命令,默認情況下,screen接收以C-a開始的命令。這種命令形式在screen中叫做鍵綁定(key
binding),C-a叫做命令字符(command character)。
使用時注意:
在當shell中提示了nohup成功后,還需要按終端上鍵盤任意鍵退回到shell輸入命令窗口,然后通過在shell中輸入exit來退出終端;如果在nohup執行成功后直接點關閉程序按鈕關閉終端的話,這時候會斷掉該命令所對應的session,導致nohup對應的進程被通知需要一起shutdown,起不到關掉終端后調用程序繼續后台運行的作用。 比如輸入a enter 就可以回到shell了 不要通過ctrl+c來回到命令行
使用 jobs 查看任務。
使用 fg %n 關閉 參考自:http://soft.chinabyte.com/os/313/12236813.shtml
appear change 仿宋
Translation utf-8
192.168.145.136
字體是斜的。 最上面的那個問題。只需要配置utf-8