1 votes

Comment afficher une commande netstat toutes les 2 secondes dans un fichier texte ?

J'essaie de faire ce qui suit, mais j'ai du mal à le faire fonctionner comme prévu. J'ai essayé d'utiliser la commande watch, mais la sortie est juste un désordre. J'ai trouvé ce qui suit, mais je n'ai pas réussi à le faire fonctionner pour mes besoins :

watch 2 "netstat -a | grep 20427 | grep ESTABLISHED | wc -l"

J'aimerais exécuter la commande suivante et générer un fichier contenant les deux colonnes suivantes toutes les deux secondes.

netstat -a | grep 20427 | grep ESTABLISHED | wc- l

DATE_TIME | NUMBER_OF_CONNECTIONS
Fri Nov  6 14:57:37 | 5
Fri Nov  6 14:57:39 | 10
Fri Nov  6 14:57:41 | 5
Fri Nov  6 14:57:43 | 2

Je vous remercie de l'aide que vous pourrez m'apporter. Prenez soin de vous et soyez prudents.

1voto

Kamil Maciorowski Points 57004

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 :

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

  2. 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 :

  1. Vous voulez un en-tête. Placez-le d'abord dans le fichier, puis ajoutez-y ( >> ) au fichier.

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X