Назад | Перейти на главную страницу

Как беззвучно транслировать предупреждение от cronjob через «стену»?

Итак, у меня есть эта cronjob на машине Ubuntu 16.04, которая заканчивается на

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

который я использую, чтобы предупредить всех пользователей о происходящем. Хотя я перенаправляю его вывод на /dev/null, скрипту каким-то образом удается вывести

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 call является причиной вашей проблемы, потому что cron не запускает TTY. Это происходит потому, что имя tty указано в сообщении баннера I.E.

Broadcast message from user@host (pts/0)

Однако, исходя из логики, он не будет пробовать это, если вы не скажете ему напечатать баннер. Легко избежать этой проблемы, вызвав wall как это:

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

Это должно полностью избежать проблемы. Однако в конечном результате вам нужно будет предоставить свой собственный баннер.

Причина, по которой это не работает так, как вы ожидаете, заключается в том, что у вас указаны два перенаправления в неправильном порядке. Порядок имеет значение. Вы написали:

wall 2>&1 > /dev/null

что означает «перенаправить stderr в то же место, где в данный момент работает stdout (обычно tty), а затем перенаправить stdout в / dev / null». Вы должны были написать:

wall > /dev/null 2>&1

что означает «перенаправить stdout в / dev / null, а затем перенаправить stderr в то же место, где stdout в данный момент находится (теперь это / dev / null)».