我在/etc/cron.daily/apf中找到了这段代码
#!/bin/bash /etc/apf/apf -f >> /dev/null 2>&1 /etc/apf/apf -s >> /dev/null 2>&1
正在刷新并重新加载防火墙 我不明白>> /dev/null 2>&1部分。< / p > 在cron中有这个的目的是什么?它覆盖了我的防火墙规则。 我可以安全地删除这个cron作业吗?< / p >
>> /dev/null 2>&1
这是安静地执行程序并隐藏其所有输出的方法。
/dev/null是一个特殊的文件系统对象,它会丢弃写入其中的所有内容。将流重定向到它意味着隐藏程序的输出。
/dev/null
2>&1部分表示“将错误流重定向到输出流”,因此当你重定向输出流时,错误流也会被重定向。即使你的程序现在写入stderr,这个输出也会被丢弃。
2>&1
stderr
>> /dev/null将标准输出(stdout)重定向到/dev/null,后者将丢弃它。
>> /dev/null
stdout
(>>似乎有点多余,因为>>表示追加,而>表示截断和写入,并且追加到/dev/null或写入/dev/null具有相同的净效果。出于这个原因,我通常只使用>。)
>>
>
2>&1将标准错误(2)重定向到标准输出(1),然后由于标准输出已经被重定向,标准输出也会丢弃它。
2
1
正如其他人所描述的,写入/dev/null消除了程序的输出。通常cron会为由cronjob启动的进程的每个输出发送一封电子邮件。因此,通过将输出写入/dev/null,如果您在cron中指定了您的地址,则可以防止收到垃圾邮件。
编辑/etc/conf.apf。设置DEVEL_MODE="0"。DEVEL_MODE设置为1将添加一个cron作业,在5分钟后停止apf。
/etc/conf.apf
DEVEL_MODE="0"
DEVEL_MODE
我使用>> /dev/null 2>&1作为一个静默的cronjob。cronjob可以做这项工作,但不会把报告发送到我的电子邮件。
据我所知,不要删除/dev/null。它很有用,特别是当你运行cPanel时,它可以用于丢弃cronjob报告。
/dev/null是一个标准文件,它丢弃你写入的所有内容,但报告写入操作成功。
1是标准输出,2是标准错误。
2>&1重定向标准错误到标准输出。&1表示文件描述符(标准输出),否则(如果只使用1)将标准错误重定向到名为1的文件。[any command] >>/dev/null 2>&1将所有标准错误重定向到标准输出,并将所有标准错误写入/dev/null。
&1
[any command] >>/dev/null 2>&1
让我们把>> /dev/null 2>&1语句分解成几个部分:
第1部分: >>输出重定向
这用于重定向程序输出并将输出附加在文件的末尾。更多…
第2部分: /dev/null特殊文件
这是一个伪设备特殊文件。
命令ls -l /dev/null会给你这个文件的详细信息:
ls -l /dev/null
crw-rw-rw-. 1 root root 1, 3 Mar 20 18:37 /dev/null
你有没有观察crw?这意味着它是一个提供串行访问的< em > character-special-file < / em >类型的伪设备文件。
crw
/dev/null接受并丢弃所有输入;不产生输出(总是在读取时返回文件结束指示)。参考:维基百科
第3部分: 2>&1(合并流2和流1的输出)
当你执行一个程序时,操作系统总是打开三个文件,标准输入,标准输出和标准错误,正如我们所知,每当打开一个文件时,操作系统(从内核)返回一个称为文件描述符的非负整数。这些文件的文件描述符分别为0、1和2。
所以2>&1只是说将标准错误重定向到标准输出。
&表示后面的内容是文件描述符,而不是文件名。
&
简而言之,通过使用这个命令,你告诉你的程序在执行时不要大喊大叫
使用2>&1的重要性是什么?
如果您不想产生任何输出,即使在终端产生一些错误的情况下。为了更清楚地解释,让我们考虑下面的例子:
$ ls -l > /dev/null
对于上面的命令,终端中没有输出,但是如果这个命令产生一个错误怎么办:
$ ls -l file_doesnot_exists > /dev/null ls: cannot access file_doesnot_exists: No such file or directory
尽管我将输出重定向到/dev/null,但它仍然打印在终端中。这是因为我们没有将错误输出重定向到/dev/null,所以为了重定向错误输出,也需要添加2>&1:
$ ls -l file_doesnot_exists > /dev/null 2>&1
让我一点一点地解释。
0: standard input 1: standard output 2: standard error
command >> /dev/null 2>&1中的>>将命令回显追加到/dev/null。
command >> /dev/null 2>&1
command => 1 output on the terminal screen => 2 output on the terminal screen
command >> /dev/null => 1 output to /dev/null => 2 output on the terminal screen
/dev/null 2>&1
command >> /dev/null 2>&1 => 1 output to /dev/null => 2 output is redirected to 1 which is now to /dev/null
而不是使用>/dev/null 2>& 你可以使用:wget -O /dev/null -O /dev/null example.com
我在其他论坛上看到的是。这里-O将下载的文件发送到/dev/null, -O将日志发送到/dev/null,而不是stderr。这种方式根本不需要重定向。”
另一个解决方案是:wget -q——spider mysite。com
619546年< a href = " https://serverfault.com/questions/619542/piping-wget-output-to-dev-null-in-cron/619546 " > https://serverfault.com/questions/619542/piping-wget-output-to-dev-null-in-cron/619546 # 619546 < / >
我通常在日志文件中使用该命令,目的是在多个服务器上同时运行脚本时捕捉任何错误以评估/排除问题。
sh -vxe cmd > cmd.logfile 2>&1