Como transmitir silenciosamente um aviso de um cronjob via "wall"?

4

Então eu tenho este cronjob em uma máquina Ubuntu 16.04 que termina em

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

que uso para avisar a todos os usuários sobre alguma ação que está ocorrendo. Embora eu redirecione sua saída para /dev/null , o script de alguma forma consegue produzir

wall: cannot get tty name: Inappropriate ioctl for device

que é enviado por e-mail para a conta root. Como eu faço wall silent? A transmissão funciona, mas eu não quero ter esses e-mails na minha caixa de correio raiz.

# wall -V
wall from util-linux 2.27.1
    
por Pavel 14.11.2016 / 12:42

2 respostas

5

Olhando para a fonte da parede, diz isto:

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

Esta chamada ttyname é a causa do seu problema porque o cron não executa um TTY. Está fazendo isso porque o nome tty está na mensagem do banner I.E

Broadcast message from user@host (pts/0)

Baseado fora da lógica, no entanto, não vai tentar isso, se você não diz para imprimir um banner. É trivial evitar esse problema invocando wall assim:

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

Isso deve evitar completamente o problema. Você precisará fornecer seu próprio banner, no entanto, na saída resultante.

    
por 14.11.2016 / 13:51
0

A razão pela qual isso não está funcionando da maneira esperada é porque você tem os dois redirecionamentos especificados na ordem errada. A ordem é importante. Você escreveu:

wall 2>&1 > /dev/null

que significa "redirecionar stderr para o mesmo local em que o stdout está indo atualmente (geralmente um tty) e então redirecionar o stdout para / dev / null". Você deveria ter escrito:

wall > /dev/null 2>&1

que significa "redireciona o stdout para / dev / null e então redireciona o stderr para o mesmo lugar que o stdout está atualmente indo (o que é agora / dev / null)".

    
por 17.11.2016 / 03:37

Tags