
Estoy intentando que suceda lo siguiente, pero me resulta difícil lograr que funcione como se esperaba. Intenté usar el comando watch, pero el resultado es un desastre. Encontré lo siguiente, pero no pude hacerlo funcionar para mis necesidades:
watch 2 "netstat -a | grep 20427 | grep ESTABLISHED | wc -l"
Me gustaría ejecutar el siguiente comando y generarlo en un archivo con las siguientes dos columnas cada dos segundos.
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
Gracias por cualquier ayuda que pueda brindar. Cuídate y mantente seguro.
Respuesta1
watch
es una buena herramienta cuando quieres... bueno, mirar. Interactúa con el terminal. Si redirige su salida a un archivo, eventualmente encontrará secuencias de control de terminal escritas en el archivo. Si esto es lo que intentaste, entonces esas secuencias probablemente sean el desastre que mencionaste.
Una forma sencilla de ejecutar un comando en un bucle es... bueno, utilizar un bucle. :)
Dijiste que querías ejecutar netstat | …
"cada 2 segundos". En un bucle tienes dos opciones:
Ejecuta la canalización de forma asincrónica,
sleep
durante 2 segundos y ejecuta la nueva; etcétera. De esta manera es casi perfecto "cada 2 segundos". Pero si la ejecución de una única iteración dura más que el intervalo, el resultado de la misma puede aparecer después del resultado de la siguiente, o incluso intercalarse con él.Ejecuta la canalización sincrónicamente,
sleep
durante 2 segundos y ejecuta la nueva; etcétera. De esta manera no es "cada 2 segundos", sino "2 segundos entremedio". Pero como hay como máximo un oleoducto funcionando en un momento dado, no hay riesgo de que la producción general se destruya.
La nota watch -n 2 'sleep 10; date'
se ejecuta date
aproximadamente cada 10 segundos. El watch
mismo utiliza el método "2 segundos entremedio", no "cada 2 segundos".
Un bucle que se ejecuta whatever
con 2 segundos de intervalo y redirige la salida a un archivo puede ser:
while :; do whatever; sleep 2; done >output_file
En su caso hay dos problemas adicionales:
Quieres un encabezado. Colóquelo en el archivo primero y luego agregue (
>>
) al archivo.Desea que la fecha esté en la misma línea que la siguiente. La salida de
date
(incluso con un formato personalizado) termina con un carácter de nueva línea. Puedes eliminarlo contr
. O capture la salida en una variable (con$()
la que se eliminan todas las nuevas líneas finales) e imprímala más tarde.
Como esto:
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