Armazena a saída de data e o comando watch em um arquivo

20

Eu sou um novato no Linux e estou tentando assistir a um comando e tentar registrá-lo em um arquivo. Eu tentei

watch -t -n 10 "(date '+TIME:%H:%M:%S' ; ps aux | grep "pattern" | wc -l)" >> logfile

e estou esperando um resultado como

TIME: 10:32:30    12
TIME: 10:32:40    18
TIME: 10:32:50    2

para ser armazenado no arquivo de log. No entanto, quando o arquivo de log tem caracteres não imprimíveis em. Como obtenho esse tipo de saída do comando li

    
por LoudKur 15.06.2011 / 02:14

6 respostas

18

Para fazer o que você está procurando, um script simples (como @Ignacio apontou) deve fazer o seguinte:

while true
do
    echo "$(date '+TIME:%H:%M:%S') $(ps aux | grep "pattern" | wc -l)" | tee -a logfile
    sleep 2
done

Eu uso tee em vez de >> para que você possa ver a saída em seu terminal e capturá-lo em seu log.

    
por 15.06.2011 / 02:33
31

Isso pode ser feito facilmente usando watch sem usar scripts.

watch -t -n 10 "(date '+TIME:%H:%M:%S' ; ps aux | grep "pattern" | wc -l) | tee -a logfile"

    
por 18.06.2012 / 14:46
7

watch é destinado a saída para um display. Se você simplesmente quer executar um comando a cada X segundos, então deve usar apenas um loop de atraso para isso.

while true ; do somecommand ; sleep 2 ; done
    
por 15.06.2011 / 02:24
5

watch é um programa ncurses e foi projetado para ser executado em uma janela do console (não redirecionada), e é por isso que ele cria vários caracteres não imprimíveis (esses são os caracteres de controle que gerenciam e movem o cursor para redesenhar o tela).

Você pode tentar mover os comandos date / grep para um script e chamar esse script a partir de um cronjob.

    
por 15.06.2011 / 02:24
3

Ok, então eu coloco em um script e tenho o seguinte código:

#!/bin/sh
NOW=$(date '+%Y%m%d%H%M%S')
LOGFILE="log.$NOW"

while true
do
    echo $(date '+[TIME: %H:%M:%S]   Output: ' ; ps aux | grep "pattern" | wc -l ) | tee -a $LOGFILE
    sleep 2
done
    
por 15.06.2011 / 17:26
0

Me deparei com essa pergunta quando estava tentando obter uma saída melhor / registrada de du -sh $data_path . Eu usei o padrão "while command, do sleep" encontrado aqui, mas usei alguns AWK complexos para dar a saída que eu queria.

while du -sh $data_path; do sleep 1; done | awk '
$1 != size {
    size=$1;
    path=$2;
    time=systime();
    seconds=time-prevtime;
    if(seconds < 1000000000){
        seconds=seconds" seconds"
    }else{
        seconds=""
    }
    print size, path, strftime("%m/%d/%Y@%H:%M:%S", time), seconds; 
    prevtime=time
}'

Eu realmente fiz isso como um oneliner, e é por isso que existem ponto e vírgula. Mas para torná-lo legível, eu terminei. A saída se parece com:

502G /var/lib/cassandra/dump/ 05/22/2018@04:46:17
503G /var/lib/cassandra/dump/ 05/22/2018@04:46:59 42 seconds
504G /var/lib/cassandra/dump/ 05/22/2018@04:47:57 58 seconds
505G /var/lib/cassandra/dump/ 05/22/2018@04:48:55 58 seconds
506G /var/lib/cassandra/dump/ 05/22/2018@04:49:53 58 seconds
507G /var/lib/cassandra/dump/ 05/22/2018@04:50:50 57 seconds
508G /var/lib/cassandra/dump/ 05/22/2018@04:51:46 56 seconds
509G /var/lib/cassandra/dump/ 05/22/2018@04:52:44 58 seconds
510G /var/lib/cassandra/dump/ 05/22/2018@04:53:41 57 seconds
    
por 22.05.2018 / 06:55