大家可能有這樣的體驗(yàn):某個(gè)程序運(yùn)行的時(shí)候,會(huì)產(chǎn)生大量的log纷捞,但實(shí)際上我們只想讓它跑一下而已侣集,log暫時(shí)不需要或者后面才有需要。所以在這樣的情況下兰绣,我們希望程序能夠在后臺(tái)進(jìn)行世分,也就是說,在終端上我們看不到它所打出的log缀辩。為了實(shí)現(xiàn)這個(gè)需求臭埋,我們介紹以下幾種方法踪央。
我們以下面一個(gè)test程序來模擬產(chǎn)生大量log的程序,這個(gè)程序每隔1秒就會(huì)打印一句“Hello world!”:
#include
int main()
{
fflush(stdout);
setvbuf(stdout, NULL, _IONBF, 0);
while (1) {
printf("Hello world!\n");
sleep(1);
}
}
現(xiàn)在瓢阴,我們想要一個(gè)清靜的世界畅蹂,終端上不要有大量的log出現(xiàn),我們要求test程序在后臺(tái)運(yùn)行荣恐。
&
這種方法很簡(jiǎn)單液斜,就是在命令之后加個(gè)“&”符號(hào)就可以了,如下:
./test &
這樣一來叠穆,test程序就在后臺(tái)運(yùn)行了少漆。但是,這樣處理還不夠硼被,因?yàn)檫@樣做雖然程序是在后臺(tái)運(yùn)行了示损,但log依然不停的輸出到當(dāng)前終端。因此嚷硫,要讓終端徹底的清靜检访,還應(yīng)將log重定向到指定的文件:
./test >> out.txt 2>&1 &
2>&1是指將標(biāo)準(zhǔn)錯(cuò)誤重定向到標(biāo)準(zhǔn)輸出,于是標(biāo)準(zhǔn)錯(cuò)誤和標(biāo)準(zhǔn)輸出都重定向到指定的out.txt文件中仔掸,從此終端徹底清靜了脆贵。
但是這樣做要注意,如果Test程序需要從標(biāo)準(zhǔn)輸入接收數(shù)據(jù)起暮,它就會(huì)在那死等丹禀,不會(huì)再往下運(yùn)行。所以需要從標(biāo)準(zhǔn)輸入接收數(shù)據(jù)鞋怀,那這種方法最好不要使用双泪。
那現(xiàn)在程序在后臺(tái)運(yùn)行了,我們?cè)趺凑业剿孛芩疲亢芎?jiǎn)單焙矛,有兩種方法:
1.jobs命令
jobs命令可以查看當(dāng)前有多少在后臺(tái)運(yùn)行。
jobs -l
此命令可顯示所有任務(wù)的PID残腌,jobs的狀態(tài)可以是running, stopped, Terminated村斟。但是如果任務(wù)被終止了(kill),shell 從當(dāng)前的shell環(huán)境已知的列表中刪除任務(wù)的進(jìn)程標(biāo)識(shí)抛猫。
2.ps命令
ps aux|grep test
nohup命令
在命令的末尾加個(gè)&符號(hào)后蟆盹,程序可以在后臺(tái)運(yùn)行,但是一旦當(dāng)前終端關(guān)閉(即退出當(dāng)前帳戶)闺金,該程序就會(huì)停止運(yùn)行逾滥。那假如說我們想要退出當(dāng)前終端,但又想讓程序在后臺(tái)運(yùn)行败匹,該如何處理呢寨昙?
實(shí)際上讥巡,這種需求在現(xiàn)實(shí)中很常見,比如想遠(yuǎn)程到服務(wù)器編譯程序舔哪,但網(wǎng)絡(luò)不穩(wěn)定欢顷,一旦掉線就編譯就中止,就需要重新開始編譯捉蚤,很浪費(fèi)時(shí)間抬驴。
在這種情況下,我們就可以使用nohup命令缆巧。nohup就是不掛起的意思( no hang up)布持。該命令的一般形式為:
nohup ./test &
如果僅僅如此使用nohup命令的話,程序的輸出會(huì)默認(rèn)重定向到一個(gè)nohup.out文件下盅蝗。如果我們想要輸出到指定文件鳖链,可另外指定輸出文件:
nohup ./test > myout.txt 2>&1 &
這樣一來姆蘸,多管齊下墩莫,既使用了nohup命令,也使用了&符號(hào)逞敷,同時(shí)把標(biāo)準(zhǔn)輸出/錯(cuò)誤重定向到指定目錄下狂秦。
使用了nohup之后,很多人就這樣不管了推捐,其實(shí)這樣有可能在當(dāng)前賬戶非正常退出或者結(jié)束的時(shí)候裂问,命令還是自己結(jié)束了。所以在使用nohup命令后臺(tái)運(yùn)行命令之后牛柒,需要使用exit正常退出當(dāng)前賬戶堪簿,這樣才能保證命令一直在后臺(tái)運(yùn)行。