大家可能有這樣的體驗:某個程式運作的時候,會産生大量的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正常退出目前賬戶,這樣才能保證指令一直在背景運作。
原文釋出時間為:2018-09-21
原文作者: 良許
本文來自雲栖社群合作夥伴“
良許Linux”,了解相關資訊可以關注“
”。