經常在Linux上面運行程序都有這樣的體驗:
某個程序運行的時候,會產生大量的log(提示)信息,但實際上我們只想讓它跑一下而已,log暫時不需要或者后面才有需要。
同時run多個相同或者不同程序的時候,占了好多的命令行界面,作為一個強迫癥患者,就想要一個清爽的界面!
電腦不小心休眠了或者關機了,又或者wifi斷開了,沒網了,導致運行老久的程序直接中斷了,又得重頭開始!
◆◆◆ ?◆◆
先來解決第一個問題,如何放到后臺
很簡單,就是在所有命令后面都加個空格和“&”符號就可以了:
./test &
這樣一來,test程序就在后臺運行了。但是,這樣處理還不夠,因為這樣做雖然程序是在后臺運行了,但log依然不停的輸出到當前終端。因此,要讓終端徹底的清靜,還應將log重定向到指定的文件:
./test > out.txt 2>&1 &
2>&1是指將標準錯誤重定向到標準輸出,于是標準錯誤和標準輸出都重定向到指定的out.txt文件中,從此終端徹底清靜了。
如果程序已經在運行了,其實也是有辦法加入后臺的,只需使用快捷鍵?ctrl-z就能立馬放到后臺中了,不過這種方法其實是暫停了程序的運行,所以想要讓程序繼續運行還得輸入 “fg” 命令讓程序返回前臺來。
那現在程序在后臺運行了,我們怎么找到它呢?很簡單,有兩種方法:
1.jobs命令
jobs命令可以查看當前有多少在后臺運行。
jobs -l
此命令可顯示所有任務的PID,jobs的狀態可以是running, stopped, Terminated。但是如果任務被終止了(kill),shell 從當前的shell環境已知的列表中刪除任務的進程標識。
2.ps命令
ps -ef | grep test
用grep查詢ps -ef的結果,就可以顯示所有正在運行的任務中含有test關鍵詞的程序具體信息了。
◆◆◆ ?◆◆
nohup命令來避免程序中斷
在命令的末尾加個&符號后,程序可以在后臺運行,但是一旦當前終端關閉(即退出當前帳戶),該程序就會停止運行。那假如說我們想要退出當前終端,但又想讓程序在后臺運行,該如何處理呢?
實際上,這種需求在十分很常見,比如想遠程到服務器編譯軟件或者需要長時間的運行一個程序,但網絡不穩定,一旦掉線就中止了,很浪費時間。
在這種情況下,我們就可以使用nohup命令。nohup就是不掛起的意思( no hang up)。該命令的一般形式為:
nohup ./test &
如果僅僅如此使用nohup命令的話,程序的輸出會默認重定向到一個nohup.out文件下。如果我們想要輸出到指定文件,可另外指定輸出文件:
nohup?./test?>?out.txt?2>&1?&
這樣一來,多管齊下,既使用了nohup命令,也使用了&符號,同時把標準輸出/錯誤重定向到指定文件中。
PS:
還有一種也很常見的避免中斷的方法,就是使用screen命令,它能夠在一個真實終端下運行偽終端,我們可以在這個偽終端里面為所欲為,再也不用擔心網絡中斷會對我們的進程造成影響,也不用給每個命令前都加上“nohup”。
但是screen的缺點是開很多screen進程的時候,會生成多個偽終端,比較占用系統資源,另外批量生成screen的同時并在screen里面運行程序有些困難,不如nohup +?&批量處理的方便。