web-dev-qa-db-fra.com

Stocker la sortie de la date et regarder la commande dans un fichier

Je suis un débutant sur Linux et j'essaie de regarder une commande et d'essayer de la connecter dans un fichier. j'ai essayé

watch -t -n 10 "(date '+ TIME:% H:% M:% S'; ps aux | grep" modèle "| wc -l)" >> fichier journal

et j'attends un résultat comme

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

être stocké dans le fichier journal. Cependant, lorsque le fichier journal contient des caractères non imprimables. Comment puis-je obtenir ce type de sortie à partir de la commande li

23
LoudKur

Pour faire ce que vous cherchez, un script simple (comme l'a souligné @ Ignacio) devrait faire l'affaire:

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

J'utilise tee au lieu de >> pour que vous puissiez voir la sortie sur votre terminal et la capturer dans votre journal.

19
Kirk

Cela peut facilement être fait en utilisant watch aussi sans utiliser de scripts.

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

34
Kasun Gajasinghe

watch est destiné à être affiché sur un écran. Si vous souhaitez simplement exécuter une commande toutes les X secondes, vous devez simplement utiliser une boucle de délai pour cela.

while true ; do somecommand ; sleep 2 ; done
7

watch est un programme ncurses et est conçu pour être exécuté dans une fenêtre de console (non redirigée), ce qui explique la création de nombreux caractères non imprimables (ce sont les caractères de contrôle qui gèrent et déplacent le curseur pour redessiner l'écran).

Vous pouvez essayer de déplacer les commandes date/grep dans un script, puis d'appeler ce script à partir d'un travail cron.

5
Darth Android

Ok, alors je l'ai mis dans un script et j'ai le code suivant:

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

Je suis tombé sur cette question lorsque j'essayais d'obtenir une meilleure sortie/connectée de du -sh $data_path. J'ai utilisé le modèle "While Commande, sommeil" trouvé ici, mais j'ai utilisé un AWK complexe pour donner le résultat souhaité.

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

En fait, je l'ai fait en tant que doublure, c'est pourquoi il y a des points-virgules. Mais pour le rendre lisible, je l'ai éclaté. La sortie ressemble à:

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
Bruno Bronosky