这篇 crontab 基础知识文章中的 '>/dev/null 2>&1' 是什么意思?

这篇 crontab 基础知识文章中的 '>/dev/null 2>&1' 是什么意思?

我正在读一篇关于定时任务

有一些关于禁用自动发送电子邮件的操作。

  1. 禁用电子邮件 默认情况下,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 文档项目输入/输出重定向页。

cron仅当您的工作有一些输出时才会向您发送电子邮件。由于所有内容都重定向到null,因此没有输出,因此cron不会向您发送电子邮件。

答案2

/dev/null是一个充当黑洞的设备文件。无论写入什么内容,都会被丢弃或消失。当您运行一个为您提供输出的脚本时,如果我们> /dev/null 2>&1在脚本末尾添加 a ,我们会要求脚本将从脚本生成的任何内容(输出和错误消息)写入/dev/null.

打破它:

  • 2是标准错误的句柄或STDERR
  • 1是标准输出的句柄或STDOUT

2>&1要求将所有STDERRas定向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

答案3

这是标准 I/O 重定向。

始终打开三个默认文件。

  • 标准输入 (0)
  • 标准输出 (1)
  • 标准错误 (2)

因此,在此示例中,stdout ( 1) 被重定向到/dev/null.

null设备是一个设备文件,它会丢弃写入其中的所有数据。

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

所以将其放在 crontab 作业的末尾将抑制命令的所有输出和错误。

参考

输入/输出重定向

答案4

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

需要明确的是,该命令的标准输出 ( stdout) 的含义。现在,如果您uptime在 cornjob 中执行以下命令:

uptime >/dev/null 2>&1
  • 2>&1表示将通道 2 ( stderr) 重定向到通道 1 ( stdout)。两个输出现在位于同一通道 ( 1)。
  • >/dev/null: 表示标准输出(和标准错误输出)被发送到/dev/null/dev/null是一个特殊文件:

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

因此,您丢弃输出,并且 cron 没有任何可发送的内容。

相关内容