大家可能有這樣的體驗:某個程序運行的時候,會產(chǎn)生大量的log,但實際上我們只想讓它跑一下而已,log暫時不需要或者后面才有需要。所以在這樣的情況下,我們希望程序能夠在后臺進(jìn)行,也就是說,在終端上我們看不到它所打出的log。為了實現(xiàn)這個需求,我們介紹以下幾種方法。
我們以下面一個test程序來模擬產(chǎn)生大量log的程序,這個程序每隔1秒就會打印一句“Hello world!”:
現(xiàn)在,我們想要一個清靜的世界,終端上不要有大量的log出現(xiàn),我們要求test程序在后臺運行。
###
這種方法很簡單,就是在命令之后加個“&”符號就可以了,如下:
。/test &
這樣一來,test程序就在后臺運行了。但是,這樣處理還不夠,因為這樣做雖然程序是在后臺運行了,但log依然不停的輸出到當(dāng)前終端。因此,要讓終端徹底的清靜,還應(yīng)將log重定向到指定的文件:
。/test 》》 out.txt 2》&1 &
2》&1是指將標(biāo)準(zhǔn)錯誤重定向到標(biāo)準(zhǔn)輸出,于是標(biāo)準(zhǔn)錯誤和標(biāo)準(zhǔn)輸出都重定向到指定的out.txt文件中,從此終端徹底清靜了。
但是這樣做要注意,如果Test程序需要從標(biāo)準(zhǔn)輸入接收數(shù)據(jù),它就會在那死等,不會再往下運行。所以需要從標(biāo)準(zhǔn)輸入接收數(shù)據(jù),那這種方法最好不要使用。
那現(xiàn)在程序在后臺運行了,我們怎么找到它呢?很簡單,有兩種方法:
1. jobs命令
jobs命令可以查看當(dāng)前有多少在后臺運行。
jobs -l
此命令可顯示所有任務(wù)的PID,jobs的狀態(tài)可以是running, stopped, Terminated。但是如果任務(wù)被終止了(kill),shell 從當(dāng)前的shell環(huán)境已知的列表中刪除任務(wù)的進(jìn)程標(biāo)識。
2. ps命令
ps aux | grep test
##nohup命令##
在命令的末尾加個&符號后,程序可以在后臺運行,但是一旦當(dāng)前終端關(guān)閉(即退出當(dāng)前帳戶),該程序就會停止運行。那假如說我們想要退出當(dāng)前終端,但又想讓程序在后臺運行,該如何處理呢?
實際上,這種需求在現(xiàn)實中很常見,比如想遠(yuǎn)程到服務(wù)器編譯程序,但網(wǎng)絡(luò)不穩(wěn)定,一旦掉線就編譯就中止,就需要重新開始編譯,很浪費時間。
在這種情況下,我們就可以使用nohup命令。nohup就是不掛起的意思( no hang up)。該命令的一般形式為:
nohup 。/test &
如果僅僅如此使用nohup命令的話,程序的輸出會默認(rèn)重定向到一個nohup.out文件下。如果我們想要輸出到指定文件,可另外指定輸出文件:
nohup 。/test 》 myout.txt 2》&1 &
這樣一來,多管齊下,既使用了nohup命令,也使用了&符號,同時把標(biāo)準(zhǔn)輸出/錯誤重定向到指定目錄下。
使用了nohup之后,很多人就這樣不管了,其實這樣有可能在當(dāng)前賬戶非正常退出或者結(jié)束的時候,命令還是自己結(jié)束了。所以在使用nohup命令后臺運行命令之后,需要使用exit正常退出當(dāng)前賬戶,這樣才能保證命令一直在后臺運行。
責(zé)編AJX
-
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209322 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6801瀏覽量
123283 -
命令
+關(guān)注
關(guān)注
5文章
683瀏覽量
22011
發(fā)布評論請先 登錄
相關(guān)推薦
評論