shell中可能經常能看到:>/dev/null 2>&1
命令的結果可以通過%>的形式來定義輸出
/dev/null 代表空設備文件
> 代表重定向到哪里,例如:echo "123" > /home/123.txt
1 表示stdout標准輸出,系統默認值是1,所以">/dev/null"等同於"1>/dev/null"
2 表示stderr標准錯誤
& 表示等同於的意思,2>&1,表示2的輸出重定向等同於1
那么本文標題的語句:
1>/dev/null 首先表示標准輸出重定向到空設備文件,也就是不輸出任何信息到終端,說白了就是不顯示任何信息。
2>&1 接着,標准錯誤輸出重定向等同於 標准輸出,因為之前標准輸出已經重定向到了空設備文件,所以標准錯誤輸出也重定向到空設備文件。
A. 1> /dev/null 表示將命令的標准輸出重定向到 /dev/null2>/dev/null 表示將命令的錯誤輸出重定向到 /dev/null1 - denotes stdout ( standard output )2 - denotes stderr ( standard error )/dev/null就相當與windows里的回收站,只是進去了不能再出來了。>/dev/null 就是將標准輸出和標准出錯的信息屏蔽不顯示
B.>/dev/null 2>&1 also can write as 1>/dev/null 2>&1 - stdout redirect to /dev/null (no stdout) ,and redirect stderr to stdout (stderr gone as well) . end up it turns both stderr and stdout off
C.a little practice may help to undstand above . #ls /usr /nothing #ls /usr /nothing 2>/dev/null #ls /usr /nothing >/dev/null 2>&1
我們經常會在UNIX系統下的一些腳本中看到類似”2>&1″這樣的用法,例如“/path/to/prog 2>&1 > /dev/null &”,那么它的具體含義是什么呢?
UNIX有幾種輸入輸出流,它們分別與幾個數字有如下的對應關系:0-標准輸入流(stdin),1-標准輸出流(stdout),2-標准錯誤流 (stderr)。”2>&1″的意思就是將stderr重定向至stdout,並一起在屏幕上顯示出來。如果不加數字,那么默認的重定向動作是針對stdout(1)的,比如”ls -l > result”就等價於”ls -l 1 > result”。這樣便於我們更普遍性的理解重定向過程。
下面舉例說明:
#cat std.sh
#!/bin/sh
echo “stdout”
echo “stderr” >&2
#/bin/sh std.sh 2>&1 > /dev/null
stderr
#/bin/sh std.sh > /dev/null 2>&1
第一條命令的輸出結果是stderr,因為stdout和stderr合並后一同重定向到/dev/null,但stderr並未被清除,因此仍將在屏幕中顯示出來;第二條命令無輸出,因為當stdout重定向至/dev/null后,stderr又重定向到了stdout,這樣stderr也被輸出到了/dev/null。
今天在做例行工作的時候,發現機器上的sendmail進程奇多無比,並且機器IO好像也很慢。后來發現在/var/spool/clientmqueue目錄下ls幾乎要死人 – 最少有10萬個文件
ps|grep sendmail看這些sendmail進程里面都有/var/spool/clientmqueue
cd過去隨便打開了個文件看了下,發現是我crontab里面執行的程序的exception,估計是我的crontab每次執行,linux都試圖發郵件給crontab的用戶但是又沒有配sendmail,所以東西就都被扔到/var/spool/clientmqueue下面了。然后我才明白為啥以前別人寫的crontab要加上> /dev/null 2>&1,原來這樣就不會每次執行crontab都把結果或者excetion發郵件了。
把這10萬個文件刪掉后,一切恢復正常
問題現象:
linux操作系統中的/var/spool/clientmqueue/目錄下存在大量文件。
原因分析:系統中有用戶開啟了cron,而cron中執行的程序有輸出內容,輸出內容會以郵件形式發給cron的用戶,而sendmail沒有啟動所以就產生了這些文件;
解決辦法: 1、 將crontab里面的命令后面加上> /dev/null 2>&1
2、知識點:
2>:重定向錯誤。
2>&1:把錯誤重定向到輸出要送到的地方。即把上述命令的執行結果重定向到/dev/null,即拋棄,同時,把產生的錯誤也拋棄。
3、具體代碼:
(1)、# crontab -u cvsroot -l
01 01 * * * /opt/bak/backup
01 02 * * * /opt/bak/backup2
(2)、# vi /opt/bak/backup
#!/bin/sh
cd /
getfacl -R repository > /opt/bak/backup.acl
(3)、# vi /opt/bak/backup2
#!/bin/sh
week=`date +%w`
tar zcvfp /opt/bak/cvs$week/cvs.tar.gz /repository >/dev/null 2>&1
4、清除/var/spool/clientmqueue/目錄下的文件:
# cd /var/spool/clientmqueue
# rm -rf *
如果文件太多,占用空間太大,用上面命令刪除慢的話,就執行下面的命令:
# cd /var/spool/clientmqueue
# ls | xargs rm -f