Almacene la salida de fecha y mire el comando en un archivo

23

Soy un novato en Linux y estoy tratando de ver un comando e intentar iniciar sesión en un archivo. Lo intenté

watch -t -n 10 "(fecha '+ HORA:% H:% M:% S'; ps aux | grep" patrón "| wc -l)" >> archivo de registro

y espero un resultado como

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

para ser almacenado en el archivo de registro. Sin embargo, cuando el archivo de registro tiene caracteres no imprimibles. ¿Cómo obtengo este tipo de salida del comando li?

LoudKur
fuente

Respuestas:

20

Para hacer lo que está buscando, un simple script (como señaló @Ignacio) debería ser el truco:

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

Utilizo en teelugar de >>para que pueda ver la salida en su terminal, así como capturarla en su registro.

Iglesia
fuente
Parece que recibo un error con el 1 en la primera línea. Pero cuando lo cambié a verdadero, funcionó. Sin embargo, la salida en la pantalla muestra el tiempo y el recuento en dos líneas diferentes, pero el archivo de registro solo muestra el recuento. ¿Hay alguna forma de obtener el tiempo y contar con la misma línea en el archivo de registro?
LoudKur
Ah cierto, porque el comando tee solo se está ejecutando ps. Modificaré mi respuesta
Kirk
¡Funciona perfectamente! Gracias. ¿Hay alguna forma de agregar la marca de tiempo al archivo de registro para que se almacene en archivos únicos?
LoudKur
¿Te refieres al nombre del archivo de registro? Puede hacer algo como el archivo de registro. $ (Fecha +% Y% m% d) para crear un nuevo archivo de registro todos los días.
Kirk
Ya hice eso. Adjunto el código como respuesta a esta pregunta. ¡Gracias!
LoudKur
37

Esto se puede hacer fácilmente usando watchtambién sin usar ningún script.

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

Kasun Gajasinghe
fuente
1
Correcto. Escribí lo que tenía en una Mac, donde el reloj no está disponible de fábrica, y opté por la solución portátil. El tuyo es mucho más simple.
Kirk
2
En otras palabras, incluya una tubería tee -a logfile dentro del argumento pasado a watch. Muy limpio, gracias.
Comodín el
7

watchestá destinado a la salida a una pantalla. Si simplemente quieres ejecutar un comando cada X segundos, entonces solo debes usar un ciclo de retraso para eso.

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

watch es un programa ncurses, y está diseñado para ejecutarse en una ventana de consola (no redirigida), por lo que está creando un montón de caracteres no imprimibles (esos son los caracteres de control que administran y mueven el cursor para volver a dibujar la pantalla).

Puede intentar mover los comandos date / grep a un script y luego llamar a ese script desde un cronjob.

Darth Android
fuente
3

Ok, entonces lo puse en un script y tengo el siguiente 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
fuente
0

Me encontré con esta pregunta cuando estaba tratando de obtener una salida mejor / registrada de du -sh $data_path. Usé el patrón "mientras que el comando, duerme" que se encuentra aquí, pero usé algunos AWK complejos para dar el resultado que quería.

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

De hecho, hice esto como una línea, por eso hay punto y coma. Pero para hacerlo legible, lo saqué. El resultado se ve así:

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
fuente
0

Aquí hay un ejemplo que solo necesitaba para un watchen un ps axfcon una marca de tiempo en la parte inferior de toda la salida. Estoy pendiente de cuando Apache falla. Tuve que canalizar teepara cada comando, el psy el 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'

Salida de muestra de tail --follow logfile-apache-issue.logen el archivo 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
fuente