標籤:
&方式:Unix/Linux下一般想讓某個程式在後台運行,很多都是使用 & 在程式結尾來讓程式自動運行。比如我們要運行mysql在後台: /usr/local/mysql/bin/mysqld_safe --user=mysql &但是我們很多程式並不象mysqld一樣可以做成守護進程,可能我們的程式只是普通程式而已,一般這種程式即使使用 & 結尾,如果終端關閉,那麼程式也會被關閉。 nohup方式:
nohup命令:不掛起的意思( no hang up)。如果你正在運行一個進程,而且你覺得在退出帳戶時該進程還不會結束,那麼可以使用nohup命令。該命令可以在你退出帳戶/關閉終端之後繼續運行相應的進程.
比如我們有個start.sh需要在後台運行,並且希望在 後台能夠一直運行,那麼就使用nohup: nohup /root/start.sh & 在shell中斷行符號後提示: [~]$ appending output to nohup.out 原程式的的標準輸出被自動改向到目前的目錄下的nohup.out檔案,起到了log的作用。 nohup問題:
nohup /root/start.sh &
但是有時候在這一步會有問題,當把終端關閉後,進程會自動被關閉,察看nohup.out可以看到在關閉終端瞬間服務自動關閉。
有個操作終端時的細節: 當shell中提示了nohup成功後還需要按終端上鍵盤任意鍵退回到shell輸入命令視窗,然後通過在shell中輸入exit來退出終端;而我是每 次在nohup執行成功後直接點關閉程式按鈕關閉終端。所以這時候會斷掉該命令所對應的session,導致nohup對應的進程被通知需要一起 shutdown。這個細節有人和我一樣沒注意到,所以在這兒記錄一下了。 當使用者啟動一個進程的時候,這個進程是運行在前台,使用與相應控制終端相聯絡的標準輸入、輸出 進行輸入和輸出。即使將進程的輸入輸出重新導向,並將進程放在後台執行,進程仍然和當前終端裝置有關係。正因為如此,在當前的登入工作階段結束時,控制終端裝置 將和登入進程相脫離,那麼系統就向所有與這個終端相聯絡的進程發送SIGHUP的訊號,通知進程線路已經掛起了,如果程式沒有接管這個訊號的處理,那麼缺 省的反應是進程結束。因此普通的程式並不能真正脫離登入工作階段而運行進程,為了使得在系統登入後還可以正常執行,只有使用命令nohup來啟動相應程式。
從上面的ps的輸出結果可以看出,有些程式沒有控制終端,這些程式通常是一些後台進程。使用命令nohup當然可以啟動這樣的程式,但nohup啟動的程式在進程執行完畢就退出,而常見的一些服務進程通常永久的運行在後台,不向螢幕輸出結果。在Unix中這些永久的後台進程稱為守護進程(daemon)。守護進程通常從系統啟動時自動開始執行,系統關閉時才停止。如果偶然某個守護進程消失了,那麼它提供的服務將不再能被使用。
在守護進程中,最重要的一個是超級守護進程inetd, 這個進程接管了大部分網路服務,但並不是對每個服務都自己進行處理,而是依據串連請求,啟動不同的服務程式與客戶機打交道。inetd支援網路服務種類在 它的設定檔案/etc/inet.conf中定義。inet.conf檔案中的每一行就對應一個連接埠地址,當inetd接受到串連這個連接埠的串連請求時, 就啟動相應的進程進行處理。使用inetd的好處是系統不必啟動很多守護進程,從而節約了系統資源,然而使用inetd啟動守護進程相應反應會遲緩一些,不適合用於被密集訪問的服務進程
如果使用nohup命令提交作業,那麼在預設情況下該作業的所有輸出都被重新導向到一個名為nohup.out的檔案中,除非另外指定了輸出檔案: nohup command > myout.file 2>&1 & 在上面的例子中,輸出被重新導向到myout.file檔案中。 使用 jobs 查看任務。 使用 fg %n 關閉。 另外有兩個常用的ftp工具ncftpget和ncftpput,可以實現背景ftp上傳和下載,這樣就可以利用這些命令在後台上傳和下載檔案了。
nohup command和nohup command &
這之間的差別是帶&的命令列,即使terminal(終端)關閉,或者電腦死機程式依然運行(前提是你把程式遞交到伺服器上);
0. nohup 命令用於把命令放在系統後台來執行,關閉命令所在的控制台和登出所有的使用者都不會有影響
例如:
nohup java -jar X.jar >/dev/null &
Linux下面Job Control的一些知識(包括jobs、bg、fg、kill命令的使用)
1.通過使用‘&’操作符讓Job在後台運行(在後台就不會被ctrl+c中斷,但是輸出仍然會顯示到螢幕上)
例如:
[email protected]:~$ cp /media/bigfile /home/user/Downloads/ &
[1] 3526
[email protected]:~$
用方括弧括起來的數字,表示系統分配給這個Job的Job Number,這裡‘[1]‘中的1,就是這個Job的Job Number。而後面一個比較大的數字,則是系統分配的進程ID。
2.使用jobs,來查看當前系統中的Job
[email protected]:~$ jobs
[1]- Running cp /media/bigfile /home/user/Downloads/ &
[2]+ Stopped cat
[email protected]:~$
這裡‘Running’、‘Stopped’表示任務的狀態。
文法:jobs [-p | -l] [-n] [-p] [-x] [job id]
參數:
-p | -l : Report the process group ID and working directory of the jobs.
-n : Display only jobs that have stopped or exited since last notified.
-p : Displays only the process IDs for the process group leaders of the selected jobs.
-x : Replace any job_id found in command or arguments with the corresponding
process group ID, and then execute command passing it arguments.
job id : The job id.
3.Suspend key 和 bg(將一個正在啟動並執行job放到後台運行)
Suspend Key,通常是Ctrl-Z將該任務掛起(也就是暫停),然後使用‘bg’命令在後台讓該job恢複執行。
[email protected]:~$ cp bigfile bigfile.bac
^Z
[1]+ Stopped cp bigfile bigfile.bac
[email protected]:~$ bg %1
[1]+ cp bigfile bigfile.bac &
[email protected]:~$
4.使用fg命令,將在背景job換到前台
[email protected]:~$ cp bigfile bigfile.bac &
[1] 3815
[email protected]:~$ fg 1
cp bigfile bigfile.bac
5.如何結束一個job
如果你想結束一個正在啟動並執行job,可以使用中斷鍵(interrupt key,通常是Ctrl-C)來結束。
[email protected]:~$ cp bigfile bigfile.bac
^C
[email protected]:~$
如果上面方法無法正常工作,那麼你可以考慮使用Ctrl-Z(Suspend key)來暫停job,使用‘jobs‘命令來查看這個job的job number,然後通過‘kill‘命令來結束這個job.
[email protected]:~$ cp bigfile bigfile.bac
^Z
[1]+ Stopped cp bigfile bigfile.bac
[email protected]:~$ jobs
[1]+ Stopped cp bigfile bigfile.bac
[email protected]:~$ kill %1
[email protected]:~$
[1]+ Terminated cp bigfile bigfile.bac
‘kill %1‘中的‘%‘告訴系統,後面的數字是一個job number。預設情況下,kill將會向程式發送一個termination signal(-TERM)。如果這個訊號不起作用,考慮使用‘kill -kill %job number‘來發送一個kill signal(-KILL)。
‘kill‘命令的使用,就看man把,info也可以,這裡不說了,上面東西太多。不過常用的也就‘kill %job number‘、‘kill -kill %job number‘、‘kill [-kill] PID‘。
Linux下Ctrl-Z、Ctrl-C、Ctrl-D的具體含義
Ctrl-Z:該鍵是linux下面預設的掛起鍵(Suspend Key),當鍵入Ctrl-Z時,系統會將正在啟動並執行程式掛起,然後放到後台,同時給出使用者相關的job資訊。此時,程式並沒有真正的停止,使用者可以通過使用fg、bg命令將job恢複到暫停前的上下文環境,並繼續執行。
Ctrl-C:該鍵是linux下面預設的中斷鍵(Interrupt Key),當鍵入Ctrl-C時,系統會發送一個中斷訊號給正在啟動並執行程式和shell。具體的響應結果會根據程式的不同而不同。一些程式在收到這個訊號後,會立即結束並推出程式,一些程式可能會忽略這個中斷訊號,還有一些程式在接受到這個訊號後,會採取一些其他的動作(Action)。當shell接受到這個中斷訊號的時候,它會返回到提示介面,並等待下一個命令。
Ctrl-D:該鍵是Linux下面標準輸入輸出的EOF。在使用標準輸入輸出的裝置中,遇到該符號,會認為讀到了檔案的末尾,因此結束輸入或輸出。
1.jobs 只限於某個控制台,控制台間彼此不通用,a控制台中的job ,在b控制台用jobs 看不到 ,但是用ps -aux 可以看到相應進程
2.job 不管是在前台還是在後台,也不管什麼狀態,其依賴於所在的控制台,關閉控制台後所有job 將不複存在(錯! 用exit)
重新導向輸出到nohup.txt檔案這個看似很方便,但是當輸出很大的時候,nohup.txt檔案會非常大,或者多個後台命令的時候大家都會輸出到nohup.txt檔案,不利於尋找結果和偵錯工具。
nohup命令與&區別,jobs,fg,bg,Ctrl-Z、Ctrl-C、Ctrl-D