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

23

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" pattern "| wc -l)" >> logfile

et j'attends un résultat comme

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

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

LoudKur
la source

Réponses:

20

Pour faire ce que vous cherchez, un simple script (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 teeau lieu de >>pour que vous puissiez voir la sortie sur votre terminal ainsi que la capturer dans votre journal.

Église
la source
Il semble que j'obtienne une erreur avec le 1 dans la première ligne. Mais quand je l'ai changé en vrai, cela a fonctionné. Cependant, la sortie à l'écran affiche le temps et le compte sur deux lignes différentes, mais le fichier journal affiche uniquement le compte. Existe-t-il un moyen d'obtenir du temps et de compter sur la même ligne dans le fichier journal?
LoudKur
Ah oui, car la commande tee ne fonctionne que pour ps. Je modifierai ma réponse.
Kirk
Marche parfaitement! Merci. Existe-t-il un moyen d'ajouter l'horodatage au fichier journal afin qu'il soit stocké dans des fichiers uniques?
LoudKur
Vous voulez dire le nom du fichier journal? Vous pouvez faire quelque chose comme fichier journal. $ (Date +% Y% m% d) pour créer un nouveau fichier journal chaque jour.
Kirk
Oui, je l'ai fait. Ci-joint le code comme réponse à cette question. Merci!
LoudKur
37

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

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

Kasun Gajasinghe
la source
1
Correct. J'ai écrit ce que j'avais sur un Mac, où la montre n'est pas disponible prête à l'emploi, et j'ai opté pour la solution portable. Le vôtre est beaucoup plus simple.
Kirk
2
En d' autres termes, inclure un tuyau à l' tee -a logfile intérieur de l'arg passé à watch. Très propre, merci.
Wildcard
7

watchest destiné à la sortie sur un écran. Si vous souhaitez simplement exécuter une commande toutes les X secondes, vous devez simplement utiliser une boucle de retard pour cela.

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

watch est un programme ncurses, et est conçu pour être exécuté dans une fenêtre de console (non redirigée), c'est pourquoi il crée un tas de 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 appeler ce script à partir d'un cronjob.

Dark Android
la source
3

Ok, donc 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
LoudKur
la source
0

Je suis tombé sur cette question lorsque j'essayais d'obtenir une sortie meilleure / enregistrée à partir de du -sh $data_path. J'ai utilisé le modèle "commande while, dormir" trouvé ici, mais j'ai utilisé un AWK complexe pour donner la sortie que je voulais.

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 comme un oneliner, 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
Bruno Bronosky
la source
0

Voici un exemple dont j'avais juste besoin pour un watchsur un ps axfavec un horodatage en bas de la sortie entière. Je regarde quand Apache échoue. Je devais diriger teepour chaque commande, le pset le 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'

Exemple de sortie de tail --follow logfile-apache-issue.logsur le fichier résultant.

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
la source