Linux標準IO和後台執行程式的方法

2021-08-26 03:26:10 字數 2885 閱讀 7003

標準輸入預設為鍵盤,也可以使用檔案和管道(pipe |);

標準輸入預設輸出到終端(terminal),但是也可以重定向到檔案、管道或後引號;

標準錯誤預設輸出到終端,但是也可以重定向到檔案中;

標準的輸入、輸出和錯誤在c中分別表示為stdin、stdout、stderr,也可以使用0,1,2來表示。

/dev/null空裝置檔案,也稱為位桶(bit bucket),它可以看作是乙個「黑洞」,等價於乙個只寫的檔案,所有的寫入內容都會永遠的消失。

/dev/zero是乙個輸入裝置,可以使用它來初始化檔案(寫入字串0),它實際上產生連續不斷的null流,主要用於建立乙個指定長度的初始化空檔案。

在shell中可能經常能看到》/dev/null 2>&1,分解這個組合為下面的五部分:

1:>表示重定向到那裡;

2: /dev/null表示空裝置檔案

3: 2>表示重定向標準錯誤stderr

4: &表示等同於的意思,2>&1表示標準錯誤的輸出重定向到等同於標準輸出

5: 1表示標準輸出stdout,系統預設輸出為1,所以》/dev/null等同於1>/dev/null。

其執行過程為:

1>/dev/null:首先將標準輸出重定向到空裝置檔案,也就是不輸出任何資訊到終端(即不顯示任何資訊);

2>&1:然後標準錯誤輸出重定向到標準輸出上,因為之前已經重定向標準輸出到空裝置檔案,此時標準錯誤也重定向到空裝置檔案中。

# command >file 2>file將產生的標準錯誤和標準輸出送到file中,此時file會開啟2次,stdout和stderr會相互覆蓋,使得兩個管道fd1和fd2同時搶占file的管道。

# command >file 2>&1 功能與上面的一樣,但是file只開啟一次,也使用乙個管道fd1。

從io效率上說,前一條命令效率明顯比後一條命令效率要低。此外,還有乙個非常有用的重定向操作符「-」,示例如下:

# (cd /src/dir && tar cf - .) | (cd /dst/dir && tar xvfp -)

該命令是把/src/dir目錄下所有檔案通過壓縮後,快速的全部移動到/dst/dir目錄中。

下面還有幾種不常見的用法:

n<&- 表示將n號輸入關閉;

<&-表示關閉標準輸入(鍵盤);

n>&-表示將n號輸出關閉;

>&-表示將標準輸出關閉。

注:清除日誌檔案內容命令# cat /dev/null > /var/log/messages

重定向符號為》,它的使用方法有下面一些:

l 1>2 表示把標準輸出stdout重定向到檔案2中;

l 1>&2 表示把標準輸出stdout重定向到標準錯誤stderr。

l command > log 表示將標準輸出重定向到log檔案中,標準錯誤輸出到終端上;

l command > log 2>1 表示將標準輸出重定向到log檔案中,標準錯誤重定向到檔案1中;

l command >log 2>&1 表示將標準輸出重定向到log檔案中,把標準錯誤重定向到標準輸出上。

l command 2>/dev/null 表示把標準錯誤資訊重定向到空裝置檔案;

l command >/dev/null 表示把標準輸出重定向到空裝置檔案;

l command >/dev/null 2>&1 表示把標準錯誤和標準輸出全部重定向到空裝置;

nohup命令的作用是不結束通話的執行命令,忽略掉所有sighup(掛起)訊號。如果你正在執行乙個程序,並且希望在退出終端時候該程序不會結束,那麼就使用nohup命令,該命令可以在退出終端或者關閉終端之後繼續執行相應的程序。

l 在登出後在後台執行命令:

# nohup ./command &

l 在後台執行命令並且將標準輸出重定向到檔案:

# nohup ./command >filename &

在linux和unix中如果希望程式執行在後台,很多都是在程式結尾使用&讓程式自動執行。

#/usr/local/mysql/bin/mysqld_safe --user=mysql &

但是如果很多程式並不像mysqld一樣做成守護程序,可能只是個普通的程式而已,一般這種程式使用&結束,但是如果終端關閉後程式也會被關閉,但是為了能夠讓它執行在後台,那麼可以使用nohup命令來實現。比如讓test.py執行在後台,那麼使用nohup命令如下:

# nohup python test.py &

值得注意的是在使用nohup時會自動寫入到nohup.out檔案中,此時nohup.out檔案會不斷的增加,可以利用/dev/null來解決這個問題。

# nohup ./program >/dev/null 2>&1 &

上面的命令讓program程式執行在後台,並且把標準輸出和標準錯誤重定向到空裝置上,不記錄到nohup.out檔案中。

如果希望停止使用nohup命令執行的程序,只能使用kill命令來結束。

使用jobs命令檢視任務,使用fg %n來關閉後台執行程式,使用ps -ef | grep command可以來檢視後台執行的程式。

注:windows和linux命令對比:

在windows檢視程序使用tasklist命令,linux上使用ps –ef命令;

在windows上殺程序使用taskkill命令,> taskkill /im command /t /f,linux上使用killall。

在windows上後台執行可以使用start命令,並指定/b選項後台執行 start /b command >file,linux下在命令前面加nohup,後面加上&符號即可。

在windows上顯示文字內容可以使用type命令》 type filename,在linux下使用cat命令即可# cat filename。

work for fun,live for love!

Linux後台執行程式

shell command dev null 2 1 最後乙個符號 意思是讓程式在後台執行。dev null 的作用是將標準輸入轉向null,這樣就忽略當前的指令碼標準輸出。2 1 的作用是將標準錯誤連線至標準輸出,也將被忽略。一直不明白1 2的作用。原來!作業系統預設指定3個檔案 0標準輸入 1標...

Linux後台執行程式

在我們平常的時候執行程式的時候會產生很多的資訊,這些資訊有時候有用,有時候沒用,不過這些資料都會在該程式的log中儲存,所以把這些資訊放在前台就不是很好。我們可以將指令碼放在後台執行,不要將這些資訊顯示出來。將shell放入後台執行 比如 指令碼名稱 storm.sh 後台執行 storm.sh 這...

Linux 後台執行程式

nohup mqtt dev null 2 1 的意思是在後台執行,在執行 a.out 的時候,即使你用ctrl c,那麼a.out照樣執行 因為對sigint訊號免疫 但是要注意,如果你直接關掉shell後,a.out程序同樣消失。nohup的意思是忽略sighup訊號,所以當執行nohup a....