shell中可能经常能看到:>/dev/null 2>&1

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几乎要死人 �C 最少有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 
在一���L和日��的夜晚,我坐在家�e看著��,後�硎�C一��起,�Y果是�罾���l�F一台主�C�l生��常,伺服器的 /var/spool/mqueue 目�被塞了一堆��]有寄出的信件,而���r�]有把 /var/spool 另外分割出�恚�所以也影�到了系�y root (/) �^�K,只剩六百多 MB 可以使用,�@�r一想��有���可能. 

�@台 server 有��W校的 PC 做寄送信件,所以可能是�V告信在寄出. 

使用�@台 server 做 mail 寄信的�C器,可能是中毒,於是就不�嗟乃托懦鋈�. 
一�_始只有想到�@���原因,但是可要把被吞掉的空�g�o吐出�恚�所以就打算把所有的 mail queue 都先砍了,��然,要先停掉 mail service. 
在砍�@些正在排�的信件�r,�l�F一件事,就是�e面的�n案太多了,使用 ls 命令就�得超��t�D,�]有反��,使用 mailq �砜纯吹降资悄切┬疟� queue 住也�]�k法,後�硐胂胨懔耍�只好全剖砍了,不要再玩下去,之後,很�手的下了 rm -rf * �@下子呢,�l生了一件很�x奇的事,居然�n案太多�o法�h除,第一次�到 rm 在 complain (我是�到的,�罾��是��作者,所以他有看到 ^^). 
那�� error 是: bash: /bin/rm: Argument list too long 
�m然�o法�h除,但是�钚�K不放��,到主�C面前,�_�⒘� X Window 之後使用那 Linuxer 最常使用的�W�^螺 (nautilus) �_�⒌� /var/spool/mqueue. 喔 ~ 可以使用 X Window ��h呢 ! 後�硐胝f即然 X Window 有�@�N大的本事,那�N就用它��h了其它的 queue files 就好啦,於是�焐想��,放�钚忠��人努力的在�C房�h著 ... 
��然我也�]有�f著,�����好演完,於是�_�⑽业墓ぷ骰锇椋�再度���W路��水艇 ... 游著游著,突然想到,何不使用 find ��h除看看 ? 於是�h回�v史文件,�l�F一��命令就是 find ./ | xargs rm -rf 千�f�e小看�@小小的指令,因�樵谖铱赐曛�後不久,�钚执蜻M�恚��f已��h到手�,�@�r也是晚上十�c了,於是我就推�]了�@���@道指令,嗯,很好,全都�h了,��H快的 ... 
喔,��]�f�槭颤N���h到手�,是因�� nautilus 在 Load 目��r,是分批的,不是一次全部�x,所以一次大�s是�浊Х庠谧x,�h了之後,�]想到又冒出了�有�浊Х� ... 真是��死人,後�硗普����是分批的�P�S. 
在下了 find ./ | xargs rm -rf 之後,�在���快速之�N,就�l�F�r�g不多了,�W校也要�P�T,所以就先 say bye bye,在�F�隹嗝�的�钚忠不丶倚菹⒘�. 
分析: 
rm 有最大一次�h除的�盗浚�所以��一��目��e有太多的�n案或目��r,就��出�F�e�`,小弟��^���是在二�f以下,而使用 find ./ | xargs rm -rf 的目的是先使用 find 列出�n案,再��向到 xargs,xargs 再喂�o rm,在�@�e,xargs ��分批依照 rm 的最大�盗筐j�o rm,然後就可以�利�h除�n案了 
。而真正的原因,有可能是 rm 的版本或是�n案系�y的���},我也不再�^�m追就,反正能�k好事就好icon_smile.gif 
下面提供���r小弟�y�的一��小小 shell script 
下�d: 
mk-file.sh 
(�@�� shell script ��有目�下�a生 20000 ���n案。) 
接下��碜��小小�y�: 
root # mkfile.sh 
root # 
���a生 20000 ��小�n案,名�Q�� test-file-{1~19999} 
直接使用 rm 去�h除: 
root # rm -rf test-file-* 
-bash: /bin/rm: Argument list too long (��回��引�颠^�L的�息) 
改搭配 find ��h除 
root # find ./ -iname 'test-file-*' | xargs rm -rf 
root # ls 
mk-file.sh 
root # 
�@�泳晚�利被�h除了。 

--------------------------------- 
#tool_action 
45 4 * * * /bin/sh /data/stat/crontab/exec_tool_action_analysis_db.sh >> /data/stat/logs/exec_tool_action_analysis_db.sh.log > /dev/null 2>&1 

45 5 * * * /bin/sh /data/stat/crontab/exec_tool_action_analysis_user.sh >> /data/stat/logs/exec_tool_action_analysis_user.sh.log > /dev/null 2>&1 

否则在/var/spool/clientmqueue 下会产生以下文件: 
-rw-rw---- 1 smmsp   smmsp  975 Jan 17 10:50 qfq0H2o4ei031197 

---------------------------------------------------------- 

40 3 * * * sh /work/yule/shell/export_anchor_multi_4_mysql.sh > /work/yule/logs/export_anchor_multi_4_mysql.log 2>&1 

你可能感兴趣的:(error,null,信息,Standard,定向)