watch
est un bon outil lorsque vous voulez eh bien, regarder. Il interagit avec le terminal. Si vous redirigez sa sortie vers un fichier, vous trouverez éventuellement des séquences de contrôle du terminal écrites dans le fichier. Si c'est ce que vous avez essayé, ces séquences sont probablement à l'origine du désordre que vous avez mentionné.
Une façon simple d'exécuter une commande dans une boucle est de eh bien, d'utiliser une boucle :)
Vous avez dit que vous vouliez courir netstat | …
"toutes les 2 secondes". Dans une boucle, vous avez deux possibilités :
-
Vous exécutez le pipeline de manière asynchrone, sleep
pendant 2 secondes et lancer la nouvelle ; et ainsi de suite. De cette manière, l'exécution se fait presque parfaitement "toutes les 2 secondes". Mais si l'exécution d'une seule itération prend plus de temps que l'intervalle, la sortie de cette itération peut apparaître après la sortie de l'itération suivante, ou même s'entrelacer avec elle.
-
Vous exécutez le pipeline de manière synchrone, sleep
pendant 2 secondes et lance la nouvelle ; et ainsi de suite. De cette façon, ce n'est pas "toutes les 2 secondes", mais plutôt "2 secondes entre les deux". Mais comme il n'y a qu'un seul pipeline en cours d'exécution à un moment donné, il n'y a aucun risque que le résultat global soit altéré.
Note watch -n 2 'sleep 10; date'
courses date
toutes les 10 secondes environ. Les watch
utilise la méthode "2 secondes entre deux", et non "toutes les 2 secondes".
Une boucle qui s'exécute whatever
avec 2 secondes d'intervalle et redirige la sortie vers un fichier peut être :
while :; do whatever; sleep 2; done >output_file
Dans votre cas, il y a deux problèmes supplémentaires :
-
Vous voulez un en-tête. Placez-le d'abord dans le fichier, puis ajoutez-y ( >>
) au fichier.
-
La date doit figurer sur la même ligne que ce qui suit. La sortie de date
(même avec un format personnalisé) se termine par un caractère de retour à la ligne. Vous pouvez l'enlever avec tr
. Ou capturer la sortie dans une variable (avec $()
qui supprime tous les retours à la ligne) et l'imprimer plus tard.
Comme ceci :
echo 'DATE_TIME | NUMBER_OF_CONNECTIONS' >output_file
while :; do
date="$(date)"
printf '%s | ' "$date"
netstat -a | grep 20427 | grep ESTABLISHED | wc -l
sleep 2
done >>output_file