Como logar dentro do script junto com stdout

0

Estou ciente de que posso registrar usando tee

Mas eu quero logar dentro do meu script e, ao mesmo tempo, exibir o conteúdo no stdout .

Exemplo, meu código se parece com algo assim:

    names=$(print("name1 name2 name3 name4"))

    for name in names
    do
       echo "Current Name: " $name 
       related_job= ps -ef | grep $name | awk '{print $9}' >> File.dat
       echo "related job: " $related_job
    done 

Agora, esse bloco certamente echo no stdout, mas eu ainda quero registrar isso em um arquivo de log, digamos script_name.log .

Além disso, estou chamando o script por meio de um agendador e processo a restrição que não posso usar script_name | tee log_file . Eu posso apenas chamar o script pelo nome do script.

Qual poderia ser a solução para isso?

    
por NishantM 06.10.2015 / 06:59

3 respostas

1

Se você estiver usando bash , você também pode combinar exec >& do bash, para redirecionar todas as saídas do script, com a substituição do processo.

por exemplo. algo como o seguinte no início do seu script:

LOGFILE='/tmp/teelog.log'
savelog "$LOGFILE"
exec &> >(tee "$LOGFILE")

Isso redirecionará a stdout & stderr para stdout e $ LOGFILE, usando savelog para rotacionar e manter logs mais antigos (7 por padrão) toda vez que o script é executado.

    
por 06.10.2015 / 08:20
0

Muito simples; use tee com sua opção flags dentro do script, não quando você estiver chamando o script.

No final de qualquer linha echo , anexe | tee -a logfile

Em vez de qualquer redirecionamento > file , você pode usar | tee file para também enviar o texto para stdout. (Isso substitui o arquivo em vez de acrescentar, assim como o > file redirect.)

Em vez de qualquer redirecionamento >> mylog.log , você pode usar | tee -a mylog.log .

Se você tem muitas linhas envolvendo saída, eu recomendo fazer uma função simples no seu script para substituir o echo, que será parecido com echo $* | tee -a logfile . (Não tenho certeza do $* parte; eu não fiz muito com funções dentro de scripts.)

    
por 06.10.2015 / 07:45
0

tee pode ser o que você deseja. Adicione estas linhas no começo do script:

exec 1> >(tee -a logfile)
exec 2>&1

A primeira linha redireciona e acrescenta ( -a ) todo o fluxo de saída padrão ao logfile e o imprime na tela. A segunda linha redireciona o erro padrão para a saída padrão.

Também é possível com awk . Especialmente se você quiser a saída para a tela, mas registrada com uma data:

exec 1> >(awk -W interactive '{"date" | getline d; print $0; print d, $0 >> "logfile"}')
exec 2>&1

awk deve ser definido como interativo, esse awk grava sem buffer na saída padrão. Se você quiser, pode redirecionar o erro padrão para algo diferente (talvez outro arquivo de log):

exec 2> >(...)
    
por 06.10.2015 / 08:13