Memorizza l'output di date e guarda il comando in un file


23

Sono un novizio di Linux e sto cercando di guardare un comando e provare a registrarlo in un file. Provai

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

e mi aspetto un risultato simile

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

da archiviare nel file di registro. Tuttavia, quando il file di registro contiene caratteri non stampabili in. Come posso ottenere questo tipo di output dal comando li

Risposte:


20

Per fare ciò che stai cercando, un semplice script (come sottolineato da @Ignacio) dovrebbe fare il trucco:

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

Io uso teeinvece >>che in modo da poter vedere l'output sul tuo terminale e catturarlo nel tuo registro.


Mi sembra di avere un errore con l'1 nella prima riga. Ma quando l'ho cambiato in vero, ha funzionato. Tuttavia, l'output sullo schermo mostra Tempo e conta su due righe diverse, ma il file di registro mostra solo il conteggio. Esiste un modo per ottenere tempo e contare sulla stessa riga nel file di registro?
LoudKur

Ah giusto, perché il comando tee è solo in esecuzione ps. Modificherò la mia risposta.
Kirk,

Funziona perfettamente! Grazie. È possibile aggiungere il timestamp al file di registro in modo che venga archiviato in file univoci?
LoudKur

Intendi il nome del file di registro? Puoi fare qualcosa come file di registro. $ (Data +% Y% m% d) per creare un nuovo file di registro ogni giorno.
Kirk,

Ya, l'ho fatto. In allegato il codice come risposta a questa domanda. Grazie!
LoudKur

37

Questo può essere fatto facilmente anche usando watchsenza usare alcun script.

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


1
Corretta. Ho scritto quello che avevo su un Mac, in cui l'orologio non è disponibile e ho optato per la soluzione portatile. Il tuo è molto più semplice.
Kirk,

2
In altre parole, includere una pipe tee -a logfile all'interno dell'arg passato a watch. Molto pulito, grazie.
Wildcard il

7

watchè pensato per l'output su un display. Se vuoi semplicemente eseguire un comando ogni X secondi, dovresti semplicemente usare un loop di ritardo per quello.

while true ; do somecommand ; sleep 2 ; done

5

watch è un programma ncurses ed è progettato per essere eseguito in una finestra della console (non reindirizzata), motivo per cui sta creando un gruppo di caratteri non stampabili (sono i caratteri di controllo che gestiscono e spostano il cursore per ridisegnare lo schermo).

Potresti provare a spostare i comandi date / grep in uno script e quindi chiamare quello script da un cronjob.


3

Ok, quindi l'ho inserito in uno script e ho il seguente codice:

#!/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

0

Mi sono imbattuto in questa domanda quando stavo cercando di ottenere un output migliore / registrato du -sh $data_path. Ho usato il modello "while command, do sleep" trovato qui, ma ho usato alcuni AWK complessi per dare l'output che volevo.

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
}'

In realtà l'ho fatto come oneliner, motivo per cui ci sono punti e virgola. Ma per renderlo leggibile, l'ho scoppiato. L'output è simile a:

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

0

Ecco un esempio di cui avevo solo bisogno per un watchon ps axfcon un timestamp nella parte inferiore dell'intero output. Sto guardando quando Apache fallisce. Ho dovuto eseguire il pipe teeper ogni comando, il pse il 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'

Output di esempio tail --follow logfile-apache-issue.logsul file risultante.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.