我正在阅读有关crontab的文章

有关禁用自动发送电子邮件的信息。




禁用电子邮件默认情况下,cron作业将电子邮件发送给执行cronjob的用户帐户。如果不需要,请在cron作业行的末尾添加以下
命令。

>/dev/null 2>&1





2>&1的详细含义是什么?为什么将其放在crontab文件的末尾会关闭电子邮件发送功能?

#1 楼

>用于重定向

/dev/null是发送任何数据的黑洞,将被丢弃

2是标准错误的文件描述符

>用于重定向

&是文件描述符的符号(如果没有,则以下1将被视为文件名)

1是标准输出的文件描述符

因此,>/dev/null 2>&1将程序的输出重定向到/dev/null。同时包含Standard ErrorStandard Out

Linux文档项目的I / O重定向页面上提供了更多信息。

cron仅在有一些输出时才通过电子邮件发送给您你工作。将所有内容重定向到null时,没有输出,因此cron将不会通过电子邮件发送给您。

评论


如果我在crontab文件中运行的命令不输出任何内容怎么办?例如rm -rf /home/somename/a.txt之类的东西。在这种情况下,我不需要添加它,对吗?

– AGamePlayer
2014年10月21日15:50

@AwQiruiGuo是的。仅当在stdout或stderr上输出时,邮件才被传递。这就是为什么他们建议将两者都重定向到/ dev / null。

– moooeeeep
2014-10-21 15:52



很好的解释

– minhas23
16-3-29在7:01

为什么2不需要fd符号?

– Sudip Bhandari
16-09-24在10:15

@SudipBhandari-因为它前面没有重定向符号(>),因此,不同于1,不能被shell误认为文件名。

–garethTheRed
16-10-14在12:24

#2 楼

/dev/null是一个类似黑洞的设备文件。不管写什么,它都会被丢弃或消失。当您运行一个提供输出的脚本时,如果我们在脚本的末尾添加了> /dev/null 2>&1,则要求脚本将该脚本生成的任何内容(输出和错误消息)都写入/dev/null。 />
要分解它:



2是标准错误的句柄,或者STDERR



1是标准输出或STDOUT的句柄2>&1要求将所有STDERR定向为STDOUT,(即,将从脚本生成的所有错误消息都视为其标准输出)。现在,脚本末尾已经有了> /dev/null,这意味着所有标准输出(STDOUT)将被写入/dev/null。由于STDERR现在要转到STDOUT(由于2>&1),因此STDERRSTDOUT都在黑洞/dev/null中结束。换句话说,脚本是静音的。

,您需要在>前面有一个/dev/null 2>&1。应该是:

x * * * * /path/to/my/script > /dev/null 2>&1


评论


2>&1在我们将脚本的O / P重定向到/ dev / null之后运行。那么,为什么还要转到/ dev / null呢?另外,当我执行脚本> / dev / null时,为什么只有STDOUT转到/ dev / null而不是所有内容?

– sbhatla
16-3-26在2:26



a)不涉及任何序列,在执行程序之前会解析并应用所有重定向,b)标准流的工作方式-STDOUT和STDERR分开用于脚本,记录和分析目的。有时候,您可能只想抑制STDOUT并在将某些内容发送到STDERR时仍然收到邮件。

–尼尔斯·库伦杰斯(Niels Keurentjes)
17年10月23日9:00

a)是的。 2>&1在脚本之后运行。因此,脚本运行时,将输出(STDOUT)写入/ dev / null,然后看到2>&1,因此将STDERR写入STDOUT,即/ dev / null。这样,2&1(STDERR和STDOUT)都以/ dev / null结尾。b)标准行为,如尼尔斯在上述评论中所解释。

– Citylight
20 Sep 2'在6:30



#3 楼

这是标准的I / O重定向。

总是打开三个默认文件。


stdin(0)
stdout(1)
stderr(2)

因此,在本示例中,标准输出(1)被重定向到/dev/null

然后将stderr重定向到stdout(null),因此,stdout和stderr都将转到2>&1

,因此请将其放在crontab的末尾作业将取消命令的所有输出和错误。

参考

I / O重定向

#4 楼

来自手册cron(8):执行命令时,任何输出都会邮寄给crontab的所有者[…]。


因此,您的文章在这里建议不产生任何输出,因此不发送邮件。
禁用邮件的另一种方法(更方便吗?)是使用-m off选项,即

crond -m off


现在有了语法:它特定于Bourne Shell语言(及其派生语言,例如bashzsh等)。 >将重定向到文件描述符n(如果未指定,则标准输出)到文件描述符fd

文件描述符可以是流地址的文件名。 &是C语言中的地址运算符。

传统上,文件描述符1是标准输出(也称为stdout),文件描述符2是标准错误(也称为stderr)。块

[n]>file

[n]>fd


将stdout重定向到/ dev / null。到输出流,该流已重定向到/ dev / null。因此,不会产生任何输出,也不会发送邮件。

警告:重定向顺序很重要:

>/dev/null


不相同as

'2>&1'


以非特权用户尝试以下两个命令:

>/dev/null 2>&1


实际上,在在后一种情况下,文件描述符2设置为文件描述符``1''的当前地址(此时为stdout),然后将文件描述符1重定向到/dev/null无论文件描述符2发生什么情况,文件描述符1仍将重定向到stdout。

#5 楼

通常,当cron执行cronjob时,它将cronjob中给出的命令输出发送给执行cronjob的用户帐户。因此,当您的cronjob执行uptime时,例如uptime的输出是通过电子邮件发送给用户的。

要清除该命令的标准输出(stdout)意味着。
现在,如果您可以在cornjob中执行以下命令uptime

uptime >/dev/null 2>&1




2>&1意味着将香奈儿2(stderr)重定向到香奈儿1(stdout)。现在,两个输出都位于同一通道(1)上。

>/dev/null:表示将标准输出(和标准错误输出)发送到/dev/null/dev/null是一个特殊文件:


写入空或零特殊文件的数据将被丢弃。


因此,您将输出和cron丢弃无法发送任何内容。

#6 楼

重定向Bash的参考手册说:


运算符[n]>&word用于复制输出文件描述符。应该使用以下格式:
&> file
....


简短:所有STDERR和STDOUT消息将重定向到/dev/null

评论


但是cron不必运行Bash:默认通常是sh。在这种情况下,即使在运行脚本之前,&> file也会直接从crontab行中失败(因此,即使脚本中的shebang也不会被调用)。

– Paul_Pedant
20年6月9日在22:46