nohup命令:如果你正在運行一個進程,而且你想在退出帳戶時該進程還不會結束,那么可以使用nohup命令。該命令可以在你退出帳戶/關閉終端之后繼續運行相應的進程。nohup就是不掛起的意思( no hang up)。
該命令的一般形式為:nohup command &
0表示鍵盤輸入
1表示屏幕輸出
2表示錯誤輸出
解釋 nohup /xxx > out.file 2 > &1 & 命令
nohup /mnt/Nand3/H2000G > /dev/null 2 > &1 &
2 > &1是把標准出錯重定向到標准輸出。第一個 > 是把標准輸出 扔到/dev/null 下面去。通俗的說,就是把所有標准輸出和標准出錯都扔到垃圾桶里面。
command >out.file 2>&1 &
解釋:
- command >out.file是將command的輸出重定向到out.file文件,即輸出內容不打印到屏幕上,而是輸出到out.file文件中。
- 2>&1 是將標准錯誤重定向到標准輸出,這里的標准輸出已經重定向到了out.file文件,即將標准錯誤也會輸出到out.file文件中。
- 最后一個& , 是讓該命令在后台執行。
試想2>1代表什么,2與>結合代表錯誤重定向,而1則代表錯誤重定向到一個文件1,而不代表標准輸出;
換成2>&1,&與1結合就代表標准輸出了,就變成標准錯誤重定向到標准輸出.
ls 2>1測試一下,不會報沒有2文件的錯誤,但會輸出一個空的文件1;
ls xxx 2>1測試,沒有xxx這個文件的錯誤輸出到了1中;
ls xxx 2>&1測試,不會生成1這個文件了,不過錯誤跑到標准輸出了;
ls xxx >out.txt 2>&1,實際上可換成 ls xxx 1>out.txt 2>&1;重定向符號>默認是1,標准錯誤和標准輸出都傳到out.txt了。
為何2>&1要寫在后面?
command > file 2>&1
首先是command > file將標准輸出重定向到file中, 2>&1 是標准錯誤拷貝了標准輸出的行為,也就是同樣被重定向到file中,最終結果就是標准輸出和錯誤都被重定向到file中。
command 2>&1 >file
2>&1 標准錯誤拷貝了標准輸出的行為,但此時標准輸出還是在終端。>file 后標准輸出才會被重定向到file,但標准錯誤仍然保持在終端。
用strace可以看到:
-
command > file 2>&1
這個命令中實現重定向的關鍵系統調用序列是:
open(file) == 3
dup2(3,1)
dup2(1,2) -
command 2>&1 >file
這個命令中實現重定向的關鍵系統調用序列是:
dup2(1,2)
open(file) == 3
dup2(3,1)
為什么要用 /dev/null 2>&1 這樣的寫法?
這條命令的意思是將標准輸出和錯誤輸出全部重定向到/dev/null中,也就是將產生的所有信息丟棄。
下面我就為大家來說一下, command > file 2>file 與command > file 2>&1 有什么不同的地方?
首先command > file 2>file 的意思是將命令所產生的標准輸出信息,和錯誤的輸出信息送到file 中。command > file 2>file 這樣的寫法,stdout和stderr都直接送到file中,file會被打開兩次,這樣stdout和stderr會互相覆蓋,這樣寫相當使用了FD1和FD2兩個同時去搶占file 的管道。
而command >file 2>&1 這條命令就將stdout直接送向file,stderr 繼承了FD1管道后,再被送往file。此時,file 只被打開了一次,也只使用了一個管道FD1,它包括了stdout和stderr的內容。
從IO效率上,前一條命令的效率要比后面一條的命令效率要低,所以在編寫shell腳本的時候,較多的時候我們會用command > file 2>&1 這樣的寫法。