Bash 直接在crontab中抑制某些输出

Bash 直接在crontab中抑制某些输出,bash,crontab,suppress,Bash,Crontab,Suppress,操作系统:ubuntu 10.04 LTS 嘿,伙计们 我们正在使用一个脚本,每天在我们的ubuntu机器上进行更新 cron deamon通过邮件发出通知 通常会出现以下情况:stdin:不是tty 如果出现此错误,我将对这一行进行注释,并且不应发送任何通知 不久前,我发现了一种直接在crontab中抑制输出的方法 但是再也找不到了 有人知道怎么做吗 问候约翰s 您的问题的答案如下: 5 0 * * * your_command 2>&1 | grep -v 'stdin: is

操作系统:ubuntu 10.04 LTS

嘿,伙计们

我们正在使用一个脚本,每天在我们的ubuntu机器上进行更新

cron deamon通过邮件发出通知

通常会出现以下情况:stdin:不是tty

如果出现此错误,我将对这一行进行注释,并且不应发送任何通知

不久前,我发现了一种直接在crontab中抑制输出的方法

但是再也找不到了

有人知道怎么做吗


问候约翰s

您的问题的答案如下:

5 0 * * * your_command 2>&1 | grep -v 'stdin: is not a tty'
将stderr重定向到stdout,然后将所有输出通过
grep-v
管道传输,以删除不必要的错误

编辑:在没有进一步调查的情况下将其插入是一个快速而肮脏的修复方法。如果你只是想让那些讨厌的邮件安静下来,然后继续前进,那就去做吧。但是,从长远来看,您可能会发现找出错误的原因并加以制止更具教育意义/更有益。然后,例如,如果您添加更多的cron作业,您就不必一直将其添加到每个作业中。不过,最终,如果不容易修复有问题的命令,您可能会发现无论如何都必须这样做

谷歌搜索表明这可能是由或引起的。检查这些,并在需要时修复它们(可能将
mesg-n
更改为
tty-s&&mesg-n

如果您无法找到问题的根源或需要更多想法,请使用更多信息更新您的问题。

错误消息:

stdin: is not a tty
表明您的cron作业中的某些内容正在尝试从标准输入读取。cron调用的作业不应该这样做(当然,除非它的标准输入被重定向)。一个小实验表明cron作业的标准输入是空的,不是tty。如果我作为cron作业运行
vi
(不要在家里尝试),我会通过电子邮件收到一条奇怪的错误消息,其中包括以下警告:

Vim: Warning: Output is not to a terminal
Vim: Warning: Input is not from a terminal
因此,显然您正在cron作业中运行某种东西,(a)假设它可以从
stdin
读取,以及(b)假设
stdin
连接到终端,即,它是某种交互式命令

如果可以,您应该跟踪是什么命令做出了这些假设,并对其进行修复,而不仅仅是丢弃错误消息。(后者让人想起用胶带盖住汽车仪表板上的警示灯来解决问题。)

不要从crontab中调用交互式命令,或者找到一种方法使您正在调用的任何命令以某种“批处理模式”运行

另一方面,您可能需要从cron作业运行一些交互式命令,而要使其正确运行太困难了。在这种情况下,您可以按照建议放弃错误消息

如果您在追踪问题时遇到困难,以下是一些有用的技巧:

通过每分钟临时运行cron作业来测试它们:

* * * * * some-command
因此,您只需等待不到一分钟即可看到结果。如果该命令是一个脚本,请尝试将其简化为显示问题的最小示例


您也可以更新您的问题,向我们展示您的CROTAB条目和正在运行的脚本(如果脚本不是太大)。您可能想考虑将实际的CROTAB条目添加到您的问题中,因为这将有助于确定应该使用什么样的输出重定向。很可能您正在寻找将标准错误重定向到

/dev/null
的内容,这是通过在命令末尾添加
2>/dev/null
实现的。但是我需要错误消息来通知。。。所以我只会抑制这个输出:stdin:不是tty。。。。。我必须知道发生了什么如果你“必须知道发生了什么”,你需要更详细地解释你的问题。更新您的问题,向我们显示您的crontab中的行。从cron执行的脚本首先不应该试图读取
stdin
;这可能是你问题的根源。这让我想起了在你汽车仪表板上的指示灯上贴胶带。最好首先找出生成错误消息的原因。可能是这样,但问题恰恰是“如何在仪表板上的指示灯上粘贴胶带?”是的,我建议一个好的答案会指出这是一个坏主意。OP很可能是故障的受害者。当然,但有时知道如何使用一点胶带来解决问题是很好的,特别是当它不是你的“汽车”需要修复时。我更新了我的答案,建议尝试找到错误的原因,而不是仅仅掩盖它。