Итак, у меня есть эта 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)».