Cron Bash Script - echo ao terminal atual em vez de / var / spool / mail / root

1

É possível que um Cron Bash Script faça eco ao terminal de sessão atual em vez de / var / spool / mail / root

Eu tenho um script que grava erros em um arquivo de log, mas qualquer informação suplementar / sem importância é exibida no terminal.

Quando executo o script no cron como root ele redireciona as mensagens para / var / spool / mail / root em vez do terminal.

Eu gostaria que eles fossem mostrados no terminal se o usuário root ou outro usuário estivesse logado em vez de armazenado. Se essas mensagens forem perdidas quando ninguém estiver logado, tudo bem. Como no Cisco IOS

    
por AirCombat 02.10.2015 / 15:09

2 respostas

1

Você pode usar o utilitário write para enviar texto a um usuário específico com login.

command that produces output | write root

A documentação explica ainda:

To write to a user who is logged in more than once, the terminal argument can be used to indicate which terminal to write to; otherwise, the recipient's terminal is selected in an implementation-defined manner and an informational message is written to the sender's standard output, indicating which terminal was chosen.

No Red Hat / CentOS, a maneira definida pela implementação é escolher o terminal com o menor tempo ocioso.

Se você quiser escrever para um dos vários usuários que podem estar conectados, faça algo assim:

for u in root alice bob charlie
do
    if users|grep -w -q $u
    then
        user=$u
        break
    fi
done
if test -n "$user"
then
    command that produces output | write $user
fi
    
por 02.10.2015 / 16:20
2

Não há "terminal atual" ao executar a partir de cron .

Por padrão, cron envia um email contendo a saída do trabalho. Seu subsistema de e-mail local entrega isso para o arquivo /var/spool/mail/$USER e você pode lê-lo usando mail , mailx ou seu cliente de e-mail local preferido.

Não há nenhum motivo específico para você não conseguir que seu trabalho cron grave sua saída em um arquivo em seu diretório pessoal, por exemplo, assim:

* * * * *    date >$HOME/.current_date 2>&1

Se você estiver executando uma GUI, poderá usar notify-send para gravar mensagens em um pop-up na tela. MAS não é fácil fazer isso a partir de cron . Tenha uma pesquisa ao redor do StackExchange para soluções para este sub-problema.

Se você quiser escrever para um tty, pode usar algo como echo hello, world >/dev/tty1 . Você provavelmente desejaria garantir que a conta certa estava realmente conectada a /dev/tty1 antes de gravar nela (isso pode ser feito verificando a propriedade do dispositivo, stat -c %U /dev/tty1 ).

#!/bin/bash
#
me=roaima    # userid to write messages to

log()
{
    local tty owner
    for tty in $( who | awk -v me="$me" '$1 == me {print $2}' )
    do
        owner="$( stat -c %U "/dev/$tty" 2>/dev/null )"
        [[ "$me" = "$owner" ]] && echo "$@" >"/dev/$tty"
    done
}

# ...

log "hello, world"
log "this is a message for you to read RIGHT NOW"
exit 0

No entanto, talvez seja melhor usar o comando write . Por exemplo, para escrever para um usuário "roaima" em um terminal conectado, você pode fazer isso:

* * * * *    echo hello from cron | write roaima >/dev/null 2>&1
    
por 02.10.2015 / 15:26