如何通过“墙”悄悄地广播来自 cronjob 的警告?

如何通过“墙”悄悄地广播来自 cronjob 的警告?

因此,我在 Ubuntu 16.04 机器上有一个 cronjob,以

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

我用它来警告所有用户正在发生某些操作。尽管我将其输出重定向到/dev/null,但脚本不知何故还是输出

wall: cannot get tty name: Inappropriate ioctl for device

它会以电子邮件的形式发送到 root 帐户。我该如何将其设为wall静音?广播可以正常工作,但我不想将这些电子邮件放在我的 root 邮箱中。

# wall -V
wall from util-linux 2.27.1

答案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

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

答案2

之所以无法按预期工作,是因为您以错误的顺序指定了两个重定向。顺序很重要。您写道:

wall 2>&1 > /dev/null

意思是“将 stderr 重定向到 stdout 当前所在的位置(通常是 tty),然后将 stdout 重定向到 /dev/null”。你应该这样写:

wall > /dev/null 2>&1

这意味着“将 stdout 重定向到 /dev/null 然后将 stderr 重定向到 stdout 当前所在的位置(现在是 /dev/null)”。

相关内容