Linux nohup指令詳解
nohup指令及其輸出檔案
今在linux上部署wdt程式,在SSH用戶端執行./start-dishi.sh,啟動成功,在關閉SSH用戶端後,運作的程式也同時終止了,怎樣才能保證在推
SSH用戶端後程式能一直執行呢?通過網上查找資料,發現需要使用nohup指令。
完美解決方案:
nohup ./start-dishi.sh >output 2>&1 &
現對上面的指令進行下解釋
用途:不挂斷地運作指令。
文法:
nohup Command [ Arg ... ] [ & ]
描述:nohup 指令運作由 Command 參數和任何相關的 Arg 參數指定的指令,忽略所有挂斷(SIGHUP)信号。在登出後使用 nohup 指令運作背景中的程式。要運作背景中的 nohup 指令,添加 & ( 表示“and”的符号)到指令的尾部。
作業系統中有三個常用的流:
0:标準輸入流 stdin
1:标準輸出流 stdout
2:标準錯誤流 stderr
一般當我們用 > console.txt,實際是 1>console.txt的省略用法;< console.txt ,實際是 0 < console.txt的省略用法。
下面步入正題:
$ nohup ./start-dishi.sh >output 2>&1 &
解釋:
1. 帶&的指令行,即使terminal(終端)關閉,或者電腦當機程式依然運作(前提是你把程式遞交到伺服器上);
2. 2>&1的意思
這個意思是把标準錯誤(2)重定向到标準輸出中(1),而标準輸出又導入檔案output裡面,是以結果是标準錯誤和标準輸出都導入檔案output裡面了。 至于為什麼需要将标準錯誤重定向到标準輸出的原因,那就歸結為标準錯誤沒有緩沖區,而stdout有。這就會導緻 >output 2>output 檔案output被兩次打開,而stdout和stderr将會競争覆寫,這肯定不是我門想要的。
這就是為什麼有人會寫成:
nohup ./command.sh >output 2>output
出錯的原因了
==================================================================================
最後談一下/dev/null檔案的作用,這是一個無底洞,任何東西都可以定向到這裡,但是卻無法打開。 是以一般很大的stdout和stderr當你不關心的時候可以利用stdout和stderr定向到這裡>./command.sh >/dev/null 2>&1
nohup指令的用法
在應用Unix/Linux時,我們一般想讓某個程式在背景運作,于是我們将常會用 & 在程式結尾來讓程式自動運作。比如我們要運作mysql在背景: /usr/local/mysql/bin/mysqld_safe –user=mysql &。可是有很多程式并不像mysqld一樣,這樣我們就需要nohup指令,怎樣使用nohup指令呢?這裡講解nohup指令的一些用法。
nohup /root/start.sh &
在shell中回車後提示:
[~]$ appending output to nohup.out
原程式的的标準輸出被自動改向到目前目錄下的nohup.out檔案,起到了log的作用。
但是有時候在這一步會有問題,當把終端關閉後,程序會自動被關閉,察看nohup.out可以看到在關閉終端瞬間服務自動關閉。
咨詢紅旗Linux工程師後,他也不得其解,在我的終端上執行後,他啟動的程序竟然在關閉終端後依然運作。
在第二遍給我示範時,我才發現我和他操作終端時的一個細節不同:他是在當shell中提示了nohup成功後還需要按終端上鍵盤任意鍵退回到shell輸入指令視窗,然後通過在shell中輸入exit來退出終端;而我是每次在nohup執行成功後直接點關閉程式按鈕關閉終端.。是以這時候會斷掉該指令所對應的session,導緻nohup對應的程序被通知需要一起shutdown。
這個細節有人和我一樣沒注意到,是以在這兒記錄一下了。
附:nohup指令參考
nohup 指令
用途:不挂斷地運作指令。
文法:
nohup Command [ Arg … ] [ & ]
描述:
nohup 指令運作由 Command 參數和任何相關的 Arg 參數指定的指令,忽略所有挂斷(SIGHUP)信号。在登出後使用 nohup 指令運作後
台中的程式。要運作背景中的 nohup 指令,添加 & ( 表示”and”的符号)到指令的尾部。
無論是否将 nohup 指令的輸出重定向到終端,輸出都将附加到目前目錄的 nohup.out 檔案中。如果目前目錄的 nohup.out 檔案不可寫,輸
出重定向到 $HOME/nohup.out 檔案中。如果沒有檔案能建立或打開以用于追加,那麼 Command 參數指定的指令不可調用。如果标準錯誤是一個終端,那麼把指定的指令寫給标準錯誤的所有輸出作為标準輸出重定向到相同的檔案描述符。
退出狀态:該指令傳回下列出口值:
126 可以查找但不能調用 Command 參數指定的指令。
127 nohup 指令發生錯誤或不能查找由 Command 參數指定的指令。
否則,nohup 指令的退出狀态是 Command 參數指定指令的退出狀态。
nohup指令及其輸出檔案
nohup指令:如果你正在運作一個程序,而且你覺得在退出帳戶時該程序還不會結束,那麼可以使用nohup指令。該指令可以在你退出帳戶/關閉終端之後繼續運作相應的程序。nohup就是不挂起的意思( n ohang up)。
該指令的一般形式為:nohup command &
使用nohup指令送出作業
如果使用nohup指令送出作業,那麼在預設情況下該作業的所有輸出都被重定向到一個名為nohup.out的檔案中,除非另外指定了輸出檔案:
nohup command > myout.file 2>&1 &
在上面的例子中,輸出被重定向到myout.file檔案中。
使用 jobs 檢視任務。
使用 fg %n 關閉。
另外有兩個常用的ftp工具ncftpget和ncftpput,可以實作背景的ftp上傳和下載下傳,這樣就可以利用這些指令在背景上傳和下載下傳檔案了。