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

AGa*_*yer 163 cron

我正在阅读一篇关于crontab的文章

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

  1. 禁用电子邮件 默认情况下,cron 作业会向执行 cronjob 的用户帐户发送一封电子邮件。如果不需要,请将以下命令放在 cron 作业行的末尾。

    >/dev/null 2>&1
    
    Run Code Online (Sandbox Code Playgroud)

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

gar*_*Red 250

> 用于重定向

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

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

> 用于重定向

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

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

因此>/dev/null 2>&1将程序的输出重定向到/dev/null. 包括Standard ErrorStandard Out

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

cron如果您的工作有一些输出,只会给您发送电子邮件。将所有内容重定向到null,没有输出,因此cron不会向您发送电子邮件。

  • 为什么 2 不需要 fd 符号? (5认同)
  • @SudipBhandari - 因为它前面没有重定向符号(`>`),因此与 `1` 不同,shell 不会将其误认为是文件名。 (4认同)
  • @AwQiruiGuo 是的。只有在 stdout 或 stderr 上有输出时才会发送邮件。这就是为什么他们建议在文章中将两者都重定向到 `/dev/null`。 (2认同)

Cit*_*ght 52

/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
Run Code Online (Sandbox Code Playgroud)

  • `2>&1` 在我们将脚本的 O/P 重定向到 `/dev/null` 后运行。那么为什么它也会转到`/dev/null`?另外,当我执行 `script > /dev/null` 时,为什么只有 STDOUT 转到 /dev/null 而不是所有内容? (8认同)
  • a) 不涉及序列,在执行程序之前解析和应用所有重定向,b) 这就是标准流的工作方式 - STDOUT 和 STDERR 被分开用于脚本、日志记录和分析目的。有时您可能只想抑制 STDOUT 并且如果有东西发送到 STDERR 仍然会收到邮件。 (5认同)

gee*_*eya 15

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

始终打开三个默认文件。

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

所以在这个例子中, stdout ( 1) 被重定向到/dev/null.

null设备是丢弃写入的所有数据的设备文件。

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

因此,将它放在 crontab 作业的末尾将抑制命令的所有输出和错误。

参考

输入/输出重定向


小智 9

从手册cron(8)

执行命令时,任何输出都会邮寄给 crontab [...] 的所有者。

所以你的文章在这里建议的是不产生输出,从而不发送邮件。禁用邮件的另一种方法(更方便?)是使用该-m off选项,即

crond -m off
Run Code Online (Sandbox Code Playgroud)

现在是语法:这是特定于 Bourne shell 语言(及其派生词,如bashzsh等)。

[n]>file

[n]>fd
Run Code Online (Sandbox Code Playgroud)

将重定向到文件描述符n(或标准输出,如果未指定)到文件描述符fd

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

通常,文件描述符1是标准输出(又名stdout),文件描述符2是标准错误(又名stderr)。大块

>/dev/null
Run Code Online (Sandbox Code Playgroud)

正在将标准输出重定向到 /dev/null。

'2>&1'
Run Code Online (Sandbox Code Playgroud)

正在将错误流重定向到已重定向到 /dev/null 的输出流。因此,不会产生任何输出,也不会发送邮件。

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

>/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

不一样

2>&1 >/dev/null
Run Code Online (Sandbox Code Playgroud)

使用非特权用户尝试这两个命令:

ls >/dev/null 2>&1
ls 2>&1 >/dev/null
Run Code Online (Sandbox Code Playgroud)

事实上,在后一种情况下,文件描述符2被设置为文件描述符 ``1 的当前地址(此时是标准输出),然后文件描述符1被重定向到/dev/null. 文件描述符2仍然重定向到标准输出,无论发生什么事情到文件描述符1