我正在阅读有关crontab的文章
有关禁用自动发送电子邮件的信息。
禁用电子邮件默认情况下,cron作业将电子邮件发送给执行cronjob的用户帐户。如果不需要,请在cron作业行的末尾添加以下
命令。
>/dev/null 2>&1
2
,>
,&
和1
的详细含义是什么?为什么将其放在crontab文件的末尾会关闭电子邮件发送功能?#1 楼
>
用于重定向/dev/null
是发送任何数据的黑洞,将被丢弃2
是标准错误的文件描述符>
用于重定向&
是文件描述符的符号(如果没有,则以下1
将被视为文件名)1
是标准输出的文件描述符因此,
>/dev/null 2>&1
将程序的输出重定向到/dev/null
。同时包含Standard Error
和Standard Out
。Linux文档项目的I / O重定向页面上提供了更多信息。
cron
仅在有一些输出时才通过电子邮件发送给您你工作。将所有内容重定向到null
时,没有输出,因此cron
将不会通过电子邮件发送给您。#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
),因此STDERR
和STDOUT
都在黑洞/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语言(及其派生语言,例如
bash
,zsh
等)。 >将重定向到文件描述符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
评论
如果我在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