linux後臺執行命令:&與nohup的用法

你們可能有這樣的體驗:某個程序運行的時候,會產生大量的log,但實際上咱們只想讓它跑一下而已,log暫時不須要或者後面纔有須要。因此在這樣的狀況下,咱們但願程序可以在後臺進行,也就是說,在終端上咱們看不到它所打出的log。爲了實現這個需求,咱們介紹如下幾種方法。shell

咱們如下面一個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 &code

這樣一來,test程序就在後臺運行了。可是,這樣處理還不夠,由於這樣作雖然程序是在後臺運行了,但log依然不停的輸出到當前終端。所以,要讓終端完全的清靜,還應將log重定向到指定的文件:進程

./test >> out.txt 2>&1 &it

2>&1是指將標準錯誤重定向到標準輸出,因而標準錯誤和標準輸出都重定向到指定的out.txt文件中,今後終端完全清靜了。編譯

可是這樣作要注意,若是Test程序須要從標準輸入接收數據,它就會在那死等,不會再往下運行。因此須要從標準輸入接收數據,那這種方法最好不要使用。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,人工智能,等等。公衆號內回覆進羣,邀請您進高手如雲技術交流羣。

img


公衆號:良許Linux

有收穫?但願老鐵們來個三連擊,給更多的人看到這篇文章

相關文章
相關標籤/搜索