如何通过“墙”悄悄地从cronjob广播警告?

所以我在Ubuntu 16.04机器上安装了这个cronjob

if ... echo "warning" | wall 2>&1 > /dev/null fi 

我用来警告所有用户发生一些行动。 虽然我把它的输出redirect到/dev/null ,脚本以某种方式pipe理输出

 wall: cannot get tty name: Inappropriate ioctl for device 

通过电子邮件发送到根帐户。 我如何让wall沉默? 广播工作,但我不想在我的根邮箱有这些电子邮件。

 # wall -V wall from util-linux 2.27.1 

看着墙上的来源说:

 259 if (print_banner == TRUE) { ... ... 271 where = ttyname(STDOUT_FILENO); 

这个ttyname调用是你的问题的原因,因为cron不运行TTY。 这是因为tty名称是在标题消息IE中

 Broadcast message from user@host (pts/0) 

基于逻辑,但它不会尝试这个,如果你不告诉它打印横幅。 它通过调用这样的wall来避免这个问题是微不足道的:

 if ... echo "warning" | wall -n 2>&1 > /dev/null fi 

这应该完全避免这个问题。 您需要在结果输出中提供自己的横幅。

这是不符合你的期望的原因是因为你有两个redirect指定错误的顺序。 订单很重要。 你写了:

 wall 2>&1 > /dev/null 

这意味着“将stderrredirect到stdout当前正在进行的地方(通常是一个tty),然后将stdoutredirect到/ dev / null”。 你应该写下:

 wall > /dev/null 2>&1 

这意味着“将stdoutredirect到/ dev / null,然后将stderrredirect到stdout当前正在进行的位置(现在是/ dev / null)”。