0

操作系统:ubuntu 10.04 LTS

大家好

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

cron 守护进程通过邮件发出通知

并且总是出现以下内容:stdin: is not a tty

此行我将注释掉,如果发生此错误,则不应发送任何通知

前段时间我发现了一种直接在 crontab 中抑制输出的方法

但是再也找不到了

有人知道该怎么做吗?

关于约翰·s。

4

2 回答 2

1

错误信息:

stdin: is not a tty

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

Vim: Warning: Output is not to a terminal
Vim: Warning: Input is not from a terminal

因此,您显然正在您的 cron 作业中运行某些东西,(a) 假设它可以从 读取stdin,并且 (b) 假设它stdin连接到终端——即,它是某种交互式命令。

如果可以,您应该追踪做出这些假设的命令并修复它,而不仅仅是丢弃错误消息。(后者让人想起通过用胶带覆盖汽车仪表板来解决警告灯的问题。)

要么不要从你的 crontab 调用交互式命令,要么找到一种方法让你调用的任何命令以某种“批处理模式”运行。

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

如果您难以追查问题,一些有用的技巧是:

通过每分钟临时运行一次来​​测试 cron 作业:

* * * * * some-command

因此,您只需等待不到一分钟即可看到结果。如果命令是脚本,请尝试将其缩减为显示问题的最小示例。

您还可以更新您的问题,向我们展示您的 crontab 条目和您正在运行的脚本(如果脚本不是太大)。

于 2014-01-17T19:24:21.550 回答
1

您的问题的答案如下:

5 0 * * * your_command 2>&1 | grep -v 'stdin: is not a tty'

将 stderr 重定向到 stdout,然后通过管道传输所有输出grep -v以删除不需要的错误。

编辑:在没有进一步调查的情况下拍打它是一个快速而肮脏的修复。如果您只需要让那些讨厌的电子邮件静音并继续前进,请执行此操作。但是,从长远来看,您可能会发现尝试找出导致错误的原因并阻止它更具教育性/有益性。然后,例如,如果您添加更多的 cron 作业,则不必继续将其添加到每个作业中。最后,你可能会发现,如果修复有问题的命令并不容易,那么无论如何你都必须这样做。

谷歌搜索表明它可能是由您的 .bashrc/root/.profile中的某些内容引起的。检查这些,并在需要时修复它们(可能更改mesg -ntty -s && mesg -n)。

如果您无法深入了解问题或需要更多想法,请使用更多信息更新您的问题。

于 2014-01-17T00:53:43.913 回答