大家可能有這樣的體驗:某個程式運行的時候,會產生大量的log,但實際上我們只想讓它跑一下而已,log暫時不需要或者后面才有需要,所以在這樣的情況下,我們希望程式能夠在后臺進行,也就是說,在終端上我們看不到它所打出的log,為了實作這個需求,我們介紹以下幾種方法,
我們以下面一個test程式來模擬產生大量log的程式,這個程式每隔1秒就會列印一句“Hello world!”:
#include
#include
#include
int main()
{
fflush(stdout);
setvbuf(stdout, NULL, _IONBF, 0);
while (1) {
printf("Hello world!\n");
sleep(1);
}
}
現在,我們想要一個清靜的世界,終端上不要有大量的log出現,我們要求test程式在后臺運行,
##&##
這種方法很簡單,就是在命令之后加個“&”符號就可以了,如下:
./test &
這樣一來,test程式就在后臺運行了,但是,這樣處理還不夠,因為這樣做雖然程式是在后臺運行了,但log依然不停的輸出到當前終端,因此,要讓終端徹底的清靜,還應將log重定向到指定的檔案:
./test >> out.txt 2>&1 &
2>&1是指將標準錯誤重定向到標準輸出,于是標準錯誤和標準輸出都重定向到指定的out.txt檔案中,從此終端徹底清靜了,
但是這樣做要注意,如果Test程式需要從標準輸入接收資料,它就會在那死等,不會再往下運行,所以需要從標準輸入接收資料,那這種方法最好不要使用,
那現在程式在后臺運行了,我們怎么找到它呢?很簡單,有兩種方法:
1. jobs命令
jobs命令可以查看當前有多少在后臺運行,
jobs -l
此命令可顯示所有任務的PID,jobs的狀態可以是running, stopped, Terminated,但是如果任務被終止了(kill),shell 從當前的shell環境已知的串列中洗掉任務的行程標識,
2. ps命令
ps aux | grep test
##nohup命令##
在命令的末尾加個&符號后,程式可以在后臺運行,但是一旦當前終端關閉(即退出當前帳戶),該程式就會停止運行,那假如說我們想要退出當前終端,但又想讓程式在后臺運行,該如何處理呢?
實際上,這種需求在現實中很常見,比如想遠程到服務器編譯程式,但網路不穩定,一旦掉線就編譯就中止,就需要重新開始編譯,很浪費時間,
在這種情況下,我們就可以使用nohup命令,nohup就是不掛起的意思( no hang up),該命令的一般形式為:
nohup ./test &
如果僅僅如此使用nohup命令的話,程式的輸出會默認重定向到一個nohup.out檔案下,如果我們想要輸出到指定檔案,可另外指定輸出檔案:
nohup ./test > myout.txt 2>&1 &
這樣一來,多管齊下,既使用了nohup命令,也使用了&符號,同時把標準輸出/錯誤重定向到指定目錄下,
使用了nohup之后,很多人就這樣不管了,其實這樣有可能在當前賬戶非正常退出或者結束的時候,命令還是自己結束了,所以在使用nohup命令后臺運行命令之后,需要使用exit正常退出當前賬戶,這樣才能保證命令一直在后臺運行,
更多精彩內容,請關注公眾號良許Linux,公眾內回復1024可免費獲得5T技術資料,包括:Linux,C/C++,Python,樹莓派,嵌入式,Java,人工智能,等等,公眾號內回復進群,邀請您進高手如云技術交流群,
最后,最近很多小伙伴找我要Linux學習路線圖,于是我根據自己的經驗,利用業余時間熬夜肝了一個月,整理了一份電子書,無論你是面試還是自我提升,相信都會對你有幫助!目錄如下:

免費送給大家,只求大家金指給我點個贊!
電子書 | Linux開發學習路線圖
也希望有小伙伴能加入我,把這份電子書做得更完美!
有識訓?希望老鐵們來個三連擊,給更多的人看到這篇文章
推薦閱讀:
- 干貨 | 程式員進階架構師必備資源免費送
- 神器 | 支持搜索的資源網站
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/102548.html
標籤:其他
