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
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.
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"
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
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.
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
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