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

23

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 "(data '+ HORA:% H:% M:% S'; ps aux | grep" padrão "| wc -l)" >> arquivo de log

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 possui caracteres não imprimíveis. Como obtenho esse tipo de saída do comando li

LoudKur
fonte

Respostas:

20

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

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

Eu uso em teevez de >>para que você possa ver a saída no seu terminal e capturá-la no seu log.

Kirk
fonte
Parece que estou recebendo um erro com o 1 na primeira linha. Mas quando eu mudei para true, funcionou. No entanto, a saída na tela mostra Tempo e conta com duas linhas diferentes, mas o arquivo de log mostra apenas a contagem. Existe alguma maneira de obter tempo e contar com a mesma linha no arquivo de log?
LoudKur
Ah, certo, porque o comando tee está sendo executado apenas ps. Vou modificar minha resposta.
Kirk
Funciona perfeitamente! Obrigado. Existe alguma maneira de adicionar o carimbo de data / hora ao arquivo de log para que ele seja armazenado em arquivos exclusivos?
LoudKur
Você quer dizer o nome do arquivo de log? Você pode fazer algo como arquivo de log. $ (Data +% Y% m% d) para criar um novo arquivo de log todos os dias.
Kirk
Ya, eu fiz isso. Anexou o código como resposta a esta pergunta. Obrigado!
LoudKur
37

Isso pode ser feito facilmente usando-o watchtambém sem usar nenhum script.

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

Kasun Gajasinghe
fonte
11
Corrigir. Escrevi o que tinha em um Mac, onde o relógio não está disponível imediatamente e optei pela solução portátil. O seu é muito mais simples.
Kirk
2
Em outras palavras, inclua um canal tee -a logfile no arg passado para watch. Muito limpo, obrigado.
Wildcard
7

watchdestina-se à saída para um monitor. Se você simplesmente deseja executar um comando a cada X segundos, basta usar um loop de atraso para isso.

while true ; do somecommand ; sleep 2 ; done
Ignacio Vazquez-Abrams
fonte
5

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

Você pode tentar mover os comandos date / grep para um script e depois chamá-lo de um cronjob.

Darth Android
fonte
3

Ok, então eu coloquei 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
LoudKur
fonte
0

Me deparei com essa pergunta quando estava tentando obter uma saída melhor / registrada du -sh $data_path. Usei o padrão "while command, sleep" encontrado aqui, mas usei um AWK complexo para fornecer 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
}'

Na verdade, eu fiz isso como um oneliner, e é por isso que há ponto e vírgula. Mas, para torná-lo legível, eu expliquei. 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
Bruno Bronosky
fonte
0

Aqui está um exemplo que eu só precisava para um watchon a ps axfcom um timestamp na parte inferior de toda a saída. Estou observando quando o Apache falha. Eu tive que canalizar teepara cada comando, oe pso date.

watch 'ps axf | grep --line-buffered "[a]pache2"| tee --append logfile-apache-issue.log; date '+TIME:%H:%M:%S' | tee --append logfile-apache-issue.log'

Saída de amostra tail --follow logfile-apache-issue.logno arquivo resultante.

29862 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29863 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29864 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29865 ?        S      0:00          \_ /usr/sbin/apache2 -k start
26635 pts/2    S+     0:00  |       \_ tail -n 1000 -f /var/log/apache2/error.log
TIME:02:21:13
13622 ?        SN     0:33      \_ /usr/sbin/apache2 -k start
25038 ?        Ss     0:01      \_ /usr/sbin/apache2 -k start
29859 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29860 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29861 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29862 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29863 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29864 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29865 ?        S      0:00          \_ /usr/sbin/apache2 -k start
26635 pts/2    S+     0:00  |       \_ tail -n 1000 -f /var/log/apache2/error.log
TIME:02:21:15
13622 ?        SN     0:33      \_ /usr/sbin/apache2 -k start
25038 ?        Ss     0:01      \_ /usr/sbin/apache2 -k start
29859 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29860 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29861 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29862 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29863 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29864 ?        S      0:00          \_ /usr/sbin/apache2 -k start
29865 ?        S      0:00          \_ /usr/sbin/apache2 -k start
26635 pts/2    S+     0:00  |       \_ tail -n 1000 -f /var/log/apache2/error.log
TIME:02:21:16
Elijah Lynn
fonte