zoukankan      html  css  js  c++  java
  • :>/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几乎要死人 – 最少有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 

    转自:http://blog.chinaunix.net/uid-25120309-id-3349718.html

  • 相关阅读:
    forward和redirect的区别
    转 jsp中 session的简单用法
    20_学生选课数据库SQL语句练习题1
    _学生选课数据库SQL语句练习题
    输入输出2
    接口提
    输入输出流3
    获取当前时间并显示在网页上
    简单的权限管理
    java关于时间
  • 原文地址:https://www.cnblogs.com/zl1991/p/6646663.html
Copyright © 2011-2022 走看看