GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo usar speedtest en un servidor Linux para verificar, almacenar e informar gráficamente las velocidades de Internet

A raíz de una serie de problemas de mala conectividad de banda ancha que estaba experimentando, decidí que quería controlar la velocidad de Mbps que recibía de mi proveedor de forma regular. Veía cifras especialmente bajas cuando intentaba descargar archivos por la noche, con velocidades mucho más rápidas alcanzadas muy temprano en la mañana.

Tengo un servidor Linux Debian sentado en una esquina, que es mi máquina de prueba y desarrollo para sitios web alojados en ISPConfig, así como algunos códigos de Let's Encrypt con los que me gusta jugar, así que busqué algún software que permitiera probar el ancho de banda, ejecutable desde una línea de comando de Linux, que podría formar la base de un sistema de script de shell automatizado para producir los datos sin procesar que necesitaba. Quería almacenar los datos en una base de datos SQL para simplificar las consultas (luego podría recopilar fácilmente más datos y simplemente extraer un subconjunto más pequeño para los períodos de tiempo que me interesaban) y tener una interfaz web que pudiera producir un gráfico simple para visualizar los datos y ayudar a resaltar los problemas de conectividad.

El primer resultado de mi búsqueda fue el artículo realmente útil de Antonio Valencia en:https://www.howtoforge.com/tutorial/check-internet-speed-with-speedtest-cli-on-ubuntu/

Después de haber seguido las instrucciones allí para instalar Speedtest, una reproducción rápida mostró que podía usarlo para ejecutar pruebas en un amplio conjunto de servidores de Internet y también generar resultados en formato CSV, que es bastante adecuado para importarse directamente a una tabla SQL con la cantidad mínima de esfuerzo en el desarrollo de software.

Para la cantidad relativamente pequeña de datos que se generarían, decidí usar SQLite como el almacén de back-end y una búsqueda rápida de las bibliotecas de gráficos basadas en JavaScript de código abierto disponibles me llevó a chart.js, que tiene un diseño simple y limpio. con una interfaz de datos simple pero con mucha capacidad para modificar las opciones avanzadas si es necesario. Convertir datos SQL para extraer solo el subconjunto de datos que quería graficar con salida a través de JSON a través de un código PHP directo era el camino a seguir.

Entonces, en general, necesitaba diseñar un sistema que se viera así:

Un servidor Linux que ejecuta speedtest como un cronjob, tal vez 1 por hora, con la salida más rápida almacenada en una base de datos SQLite, todo controlado por un archivo de script bash shell. Un front-end web, que es una mezcla de HTML, CSS, javascript y PHP para extraer datos de SQLite y producir un gráfico de barras que muestre las cifras de Mbps alcanzadas durante las 24 horas anteriores (o cualquier otro período que pueda decidir).

Un poco de experimentación con la ejecución de speedtest una docena de veces de forma interactiva me mostró que había algunos servidores disponibles que parecían dar resultados que estaban muy de acuerdo con el tipo de velocidades que estaba experimentando. Consideré una buena idea probar con más de un servidor para obtener una mejor comprensión de cómo mis cifras de Mbps se vieron afectadas por la ubicación del servidor de destino y la hora del día en una zona horaria diferente.

Si desea seguir adelante y configurar un sistema similar para usted, deberá seleccionar uno o más servidores de los cientos disponibles para Speedtest para usar que se adapten a su ubicación.

1 Requisitos previos

  • un servidor linux - Estoy usando Debian 9.1 - stretch
  • acceso tty al servidor con inicio de sesión raíz:uso PuTTY desde una computadora portátil con Windows
  • ISPConfig instalado y un sitio web configurado con una cuenta FTP también:estoy usando 3.1.6 con apache configurado como servidor web (puede administrarlo solo con un servidor web, con algunos cambios menores en las siguientes instrucciones)
  • PHP:estoy usando 7.0, pero también debería funcionar con la mayoría de las versiones anteriores
  • Cliente FTP (utilizo Filezilla) y PureFTPd ejecutándose en el servidor
  • nano - o tu editor visual favorito

Asumo aquí que se siente cómodo iniciando sesión en un servidor Linux, cómo navegar por los directorios, el diseño de dónde su servidor web espera que estén los archivos y cómo enviar archivos FTP a esos directorios.

Estos son los pasos detallados que le permitirán configurar todo esto.

2 Instalar prueba rápida

Inicie sesión en su servidor Linux como root y ejecute el comando:

# pip install speedtest-cli

Consulte https://www.howtoforge.com/tutorial/check-internet-speed-with-speedtest-cli-on-ubuntu/ y https://pypi.python.org/pypi/speedtest-cli para obtener más información si tiene algún problema.

Nota:speedtest y speedtest-cli son idénticos en mi instalación, así que solo haré referencia a speedtest a continuación.

3 Instalar SQLite3

# apt-get install sqlite3

Use el equivalente para su distribución si apt-get no es para usted.

4 Crea ancho de banda.sh

Ingrese el siguiente código de script de bash en un archivo y guárdelo como /usr/local/etc/bandwidth.sh; lo editaremos un poco más tarde para que sea específico para usted.

#!/bin/bash# ejecute pruebas de velocidad contra 3 servidores y guarde todos los resultados de salida en un archivo CSV para importar a sqlite db## ejecutado por cronjob una vez por hora##función getCSVString () { # si la prueba de velocidad falló (por ejemplo, no se pudo acceder a un servidor) necesitamos crear una entrada cero ficticia para este intervalo de tiempo # obtener una cadena de marca de tiempo en el mismo formato que genera speedtest - y necesitamos la hora UTC local RIGHTNOW=$(date --utc +%Y- %m-%dT%H:%M:%SZ) # ¿contra qué servidor estamos probando? if [ $1 ="5443" ] luego repite "5443,Fasthosts Internet,Gloucester,$RIGHTNOW,73.09,0.0,0.0,0.0" fi if [$1 ="1234" ] luego repite "1234,Uno,Milton Keynes,$RIGHTNOW ,168.27,0.0,0.0,0.0" fi if [ $1 ="1783" ] luego echo "1783,Comcast,\"San Francisco, CA\",$RIGHTNOW,8420.0,0.0,0.0,0.0" fi # prueba/depuración caso solo si [ $ 1 ="199999999" ] luego echo "99999, Test, Test, $ RIGHTNOW, 99.99, 0.0, 0.0, 0.0" fi} function runTest () { # ejecutar speedtest contra el servidor designado con la salida csv guardada en el archivo tmp /usr/local/bin/speedtest --csv --server $1> /usr/local/etc/speedtest.tmp si [ $? -gt 0 ] luego # prueba de velocidad falló, así que cree una entrada cero en lugar de cualquier mensaje de error getCSVString $1> /usr/local/etc/speedtest.tmp fi # guarde la salida lista para la siguiente prueba de servidor cat /usr/local/etc/speedtest .tmp>
> /usr/local/etc/speedtest.csv}# main######## ejecutar speedtest contra 3 servidores y guardar todos los resultados de salida en el archivo csv cd /usr/local/etc# borrar el archivo csv - necesidades estar vacío al inicio de runrm -f /usr/local/etc/speedtest.csv############################# ############## Caso de prueba/depuración:obliga a que la prueba de velocidad falle########################## ################# ejecutar prueba "199999999"# dormir 5####### comentar después de probar ############## #####################################ejecutar prueba "5443" dormir 10ejecutar prueba "1234" dormir 10runTest "1783"sleep 1# ahora importe los datos csv a sqlite dbsqlite3 -batch /usr/local/etc/bandwidth.db <<"EOF".separator ",".import /usr/local/etc/speedtest.csv ancho de bandaEOF# agregue csv de ejecución actual a backupcat /usr/local/etc/speedtest.csv>> /usr/local/etc/speedtest.bak

Pido disculpas por mi enfoque de "cinturón y llaves" de usar rutas completas para archivos en todas partes, incluso cuando no se necesitan. Es la forma en que me gusta hacerlo. Siéntase libre de mejorar esto si se siente cómodo editando scripts bash.

Establezca las propiedades del archivo para que este script sea ejecutable:

# chmod 0700 ancho de banda.sh

5 Crear una base de datos SQLite

Cree la base de datos SQLite de width.db en /usr/local/etc :

#sqlite3 ancho de banda.db

y luego, en el indicador sqlite>, cree una nueva tabla con el siguiente comando (no se pierda el último punto y coma):

sqlite> CREAR TABLA SI NO EXISTE "ancho de banda" ("serverid" INTEGER NOT NULL , "sponsor" VARCHAR NOT NULL , "servername" VARCHAR NOT NULL , "times" DATETIME PRIMARY KEY NOT NULL UNIQUE , "distance" FLOAT NOT NULL , "ping" FLOAT NOT NULL , "descargar" FLOAT NOT NULL , "subir" FLOAT NOT NULL );
sqlite> .salir

Esto crea una tabla llamada ancho de banda con campos que se asignan directamente a la salida en formato CSV de speedtest.

6 Obtener una lista de servidores

Necesitará una lista de los servidores que usa Speedtest.

# speedtest --list> servidores.txt

Ahora revise a través de servers.txt para las identificaciones numéricas de los servidores en los que desea ejecutar sus pruebas.

# nanoservidores.txt

El archivo se verá similar a esto:

Recuperando la configuración de speedtest.net... 5833) Hub Network Services Ltd (Newport, Gales) [57,50 km] 5938) Spectrum Internet (Cardiff, Gran Bretaña) [65,89 km] 5443) Fasthosts Internet (Gloucester, Gran Bretaña) [74,31 km] 6504) Secure Web Services Ltd (Shrewsbury, Gran Bretaña) [78,64 km] 7265) Unitron Systems &Development Ltd (Telford, Gran Bretaña) [87,11 km] 8225) Exascale Limited (Wolverhampton, Gran Bretaña) [96,08 km ] 3110) zero.net.uk Ltd (Studley, Gran Bretaña) [96,12 km]12401) Dragon WiFi LTD (Haverfordwest, Reino Unido) [120,78 km] 1153) Warwicknet Ltd. (Coventry, Gran Bretaña) [125,18 km] 1685 ) Vodafone UK (Newbury, Gran Bretaña) [153,25 km] 4384) Iomart (Leicester, Gran Bretaña) [157,40 km] 1234) Uno (Milton Keynes, Gran Bretaña) [170,71 km] 3504) TNP Ltd. (Manchester, Gran Bretaña) ) [170,93 km]11747) Vispa (Manchester, Reino Unido) [170,93 km]

Las identificaciones del servidor están en el lado izquierdo. La cifra al final de cada línea es la estimación que ha hecho speedtest de la distancia, en kilómetros, entre tu ubicación y la del servidor, aunque no estoy seguro de que sea demasiado precisa y puede cambiar de una ejecución a otra. Los servidores de prueba se enumerarán en el orden de esta distancia, comenzando por el más cercano. La prueba con los servidores que se encuentran en la parte superior de esta lista debería, en teoría, brindarle los pings más rápidos y las mejores velocidades de carga y descarga en comparación con los servidores que se encuentran más abajo en la lista y que están mucho más lejos.

7 Seleccione los ID del servidor y edite el ancho de banda.sh

Ahora sería el momento de ejecutar speedtest manualmente contra una selección de los diferentes ID de servidor disponibles y ver qué tipo de resultados obtiene. Elegí un par de servidores cercanos a mí en el Reino Unido y uno en California para comparar. El formato del comando a utilizar es:

# prueba de velocidad --servidor 1234

El resultado que verá será similar a:

Recuperando la configuración de speedtest.net... Probando desde xxxxxxx (n.n.n.n)... Recuperando la lista de servidores de speedtest.net... Seleccionando el mejor servidor según el ping... Organizado por Uno (Milton Keynes) [187.87 km]:33.243 msProbando la velocidad de descarga.................................... ....................................Descarga:1,60 Mbit/sProbando la velocidad de carga........ .................................................... .....................................Subida:0,55 Mbit/s

Una vez que haya seleccionado los servidores que desea usar, coloque las identificaciones numéricas del servidor (he usado 3 servidores, pero puede variar esto si lo desea) en las líneas correspondientes en ancho de banda.sh

runTest "5443"dormir 10runTest "1234"dormir 10runTest "1783"dormir 1

También deberá ajustar el código en la rutina de error que crea una entrada ficticia si la prueba de velocidad falla en una ejecución en particular.

 # ¿contra qué servidor estamos probando? if [ $1 ="5443" ] luego repite "5443,Fasthosts Internet,Gloucester,$RIGHTNOW,73.09,0.0,0.0,0.0" fi if [$1 ="1234" ] luego repite "1234,Uno,Milton Keynes,$RIGHTNOW ,168.27,0.0,0.0,0.0" fi if [ $1 ="1783" ] luego echo "1783,Comcast,\"San Francisco, CA\",$RIGHTNOW,8420.0,0.0,0.0,0.0" fi

Los números después de $RIGHTNOW allí (por ejemplo, 73.09) son las distancias en kilómetros desde su ubicación hasta el servidor en cuestión. No los uso en ninguna parte, por lo que son solo un marcador de posición y pueden tener cualquier valor numérico.

Tenga en cuenta con ese ejemplo de 1783 que tenemos que poner comillas en la ubicación y escaparlas para que entren en el archivo CSV que estamos creando. Las comillas son necesarias aquí porque esta ubicación tiene una coma dentro. Sin las comillas escapadas, la coma se trataría como un delimitador de campo CSV, lo que causaría un problema con la importación de SQLite. Si el servidor que selecciona tiene un texto de ubicación similar con una coma, deberá usar las comillas con escape.

8 Configurar un cronjob

Configure un cronjob para que se ejecute una vez por hora (o con la frecuencia que desee dentro de lo razonable) para ejecutar /usr/local/etc/bandwidth.sh. Si está ejecutando ISPConfig, puede usarlo para programar un cronjob.

Alternativamente, en la línea de comando de Linux, puede ingresar:

# crontab-e

Debería ver algo similar a esto (recuerde que ha iniciado sesión como 'root'):

* * * * * /usr/local/ispconfig/server/server.sh 2>&1 | mientras lee la línea; haz echo `/bin/date` "$line">> /var/log/ispconfig/cron.log; hecho* * * * * /usr/local/ispconfig/server/cron.sh 2>&1 | mientras lee la línea; haz echo `/bin/date` "$line">> /var/log/ispconfig/cron.log; hecho1 * * * * /usr/local/etc/ancho de banda.sh 2>&1

Si no está ejecutando ISPConfig, es posible que inicialmente esté vacío. Agregue esa última línea exactamente como se muestra arriba (el espacio es importante) para ejecutar el script de shell a partir de las 00:01 a. m. y luego repetir cada hora, todos los días. Puedes elegir diferentes horarios, por supuesto. (La primera vez que ejecute esto, crontab le preguntará qué editor desea usar; yo selecciono nano).

9 Establecer PHP open_basedir

Agregue /usr/local/etc a la entrada de PHP open_basedir para el sitio web. En ISPConfig, esto se encuentra en la pestaña Opciones del sitio web.

Esto permite que el código de ancho de banda.php pueda acceder a la base de datos SQLite, que acabamos de crear, en ese directorio.

Podríamos habernos saltado esto si hubiéramos decidido crear la base de datos en un directorio que ya está configurado como accesible, como /var/www/clients/client1/web1/web/, pero sería una mala elección desde una perspectiva de seguridad. .

10 Crear ancho de banda.php

Debe copiar este código en un archivo llamado ancho de banda.php en su servidor en el directorio de documentos web base. Si está utilizando ISPConfig, será algo como /var/www/clients/client1/web1/web/

   Monitor de ancho de banda:velocidades de descarga en las últimas 24 horas

Velocidades de descarga:últimas 24 horas

Edite este archivo para usar el ID de servidor sobre el que desea informar. Estoy usando el servidor 1234 en mi ejemplo aquí, ya que descubrí que, después de explorar algunos días de datos, este servidor estaba produciendo cifras de Mbps más alineadas con las velocidades que sentía que estaba obteniendo. El serverid está en la cláusula WHERE de la instrucción SQL SELECT:

SELECCIONE serverid, strftime("%H:%M", veces) || " " || strftime("%d/%m/%Y", times) COMO marca de tiempo, patrocinador, nombre del servidor, 
descarga
DESDE el ancho de banda
WHERE serverid =1234
ORDER BY times
LÍMITE 24 DESPLAZAMIENTO (SELECCIONE CONTADOR(*)/3 DEL ancho de banda)-24;

¿Qué está haciendo exactamente esta instrucción SQL? Si no está familiarizado con SQL, veamos cada parte.

una. SELECT es el comando para leer registros de una tabla de base de datos SQL y es seguido por los campos a leer y otras opciones.

b. strftime("%H:%M", veces) || " " || strftime("%d/%m/%Y", times) COMO marca de tiempo

es reformatear la cadena de fecha y hora que Speedtest ha creado en su salida CSV a algo un poco más fácil de usar. Quiero fechas con formato del Reino Unido, por lo que tomará una cadena como "2017-08-31T12:02:51.898186Z" y la convertirá en "12:02 31/08/2017". Es más sencillo hacer este cambio de formato directamente en la instrucción SQL en lugar de tener que procesarlo después. Los horarios aquí van a ser UTC/GMT, lo cual está bien para mí, pero es posible que desee cambiar esto; p.ej. si desea fechas con formato estadounidense, cambie esa segunda parte a strftime("%m/%d/%Y", times).

C. serverid, timestamp, sponsor, servername, download son los campos que queremos leer de la tabla SQL y crear en nuestro objeto JSON.

d. FROM ancho de banda es el nombre de la tabla SQL desde la que estamos leyendo.

mi. WHERE serverid =1234 establece el subconjunto de la tabla que se leerá; cámbielo para que coincida con el serverid que ha utilizado, y es posible que desee leer los datos de más de un servidor, pero eso complicará el gráfico.

F. ORDER BY times establece el orden de clasificación de la salida:queremos que se ordene por la marca de tiempo que Speedtest estableció para cada ejecución.

gramo. LIMIT 24 restringe la salida a 24 registros, ya que solo queremos mostrar 24 horas de datos y porque nuestro cronjob está configurado para ejecutarse una vez por hora. Si estuviera ejecutando dos veces por hora, necesitaría establecer esto en 48 para obtener 24 horas de datos.

H. DESPLAZAMIENTO (SELECCIONE CONTEO(*)/3 DEL ancho de banda)-24; queremos los últimos 24 registros de la tabla, ya que son las entradas más recientes que nos interesan, por lo que debemos especificar un DESPLAZAMIENTO para que coincida con el LÍMITE. Sin esto, siempre obtendríamos los primeros 24 registros de la tabla en lugar de los 24 más recientes. Para obtener la compensación correcta, contamos todos los registros de la tabla con (SELECT COUNT(*)), luego lo dividimos entre 3 (ya que estamos ejecutando la prueba de velocidad 3 veces por hora, una para cada uno de los 3 servidores diferentes) y luego restamos 24 de este total para obtener la posición OFFSET correcta para que LIMIT 24 obtenga los registros que queremos.

Si ha cambiado el script bash para ejecutar algo que no sea 3 pruebas de servidor diferentes por hora, ajuste esa parte /3 en consecuencia. Si solo está probando contra un servidor, entonces la división no es necesaria en absoluto.

Es posible que también desee ajustar el tamaño general del gráfico, donde he tomado la ruta fácil de codificar un tamaño adecuado para mi pantalla; se establece en esta línea:

11 Obtenga una copia local de los archivos

Prefiero tener versiones locales de cualquier archivo de biblioteca css y js (pero no las fuentes de Google) que se necesitan en una página web y, si es el mismo, deberá obtener una copia en su servidor de Chart.bundle.min. js y colóquelo en el directorio /var/www/clients/client1/web1/web/scripts en su servidor (o en el directorio base adecuado para usted).

Puede descargar el archivo desde:https://cdnjs.cloudflare.com/ajax/libs/Chartajs/2.6.0/Chart.bundle.min.js

Si no desea utilizar una copia local, edite el archivo width.php para que apunte a la versión pública de CDN. Simplemente cambie esta línea:

a esto:

12 Habilitar PHP en ISPConfig

No olvide habilitar PHP en la configuración de su sitio web, si aún no se ha configurado.

13 Cargar ancho de banda.php en el navegador

Finalmente hemos terminado. Una vez que el script de shell de ancho de banda.sh haya tenido tiempo de ejecutarse varias veces para generar algunos datos (o puede ejecutarlo manualmente varias veces al principio), apunte su navegador al sitio web de su servidor Linux, cargue ancho de banda.php y debería ver algo como esto:

Y sí, ¡mi banda ancha realmente es tan mala!

Finalmente, aquí hay algunos puntos adicionales que vale la pena cubrir:

Salida de gráfico de 14 barras

Debemos tener en cuenta que las cifras de carga y descarga almacenadas en la tabla SQL están en bps en lugar de Mbps (junto con una cantidad desconcertante de dígitos decimales, números como 1533681.5922415722). Esta es solo la forma en que speedtest produce los datos cuando se ejecuta en modo CSV. Para mostrar la cifra de Mbps, en lugar de bps, en la salida del eje Y del gráfico de barras, hay un par de líneas incluidas en el código Javascript en el ancho de banda.php para realizar la conversión:

 mbps =Math.round(ancho de banda_datos[i].download/1000).toFixed(3)/1000; bvalue =mbps.toLocaleString(indefinido, { dígitosfracciónmínimos:3 });

El uso de toLocaleString debe insertar la puntuación de base decimal correcta (un "." o ",") según lo establecido por la configuración regional de su navegador, pero esto depende de la implementación y es algo inconsistente. Si tú ves . en lugar de , y te molesta, entonces Globalize es la forma de solucionarlo. Consulte '18 Más pasos e ideas' a continuación.

Se necesitan algunas líneas más para anular el tratamiento predeterminado del código flotante de ceros finales, ya que chart.js normalmente mostrará "2.000" como solo "2", que no es lo que quiero, especialmente después de tomarme la molestia de asegurándose de que están allí en primer lugar:

 // anulamos la información sobre herramientas predeterminada que elimina los ceros finales a pesar de que ya los pusimos allí. elemento de información sobre herramientas.índice]; var etiqueta ='descargar:'; var retvalue =value.toLocaleString(indefinido, { minimalFractionDigits:3 }); etiqueta de retorno + ' ' + retvalue + ' Mbps'; } } },

Este es un buen ejemplo de cómo puede 'profundizar' en chart.js y cambiar la forma en que hace las cosas.

Además, configuré las opciones del gráfico para imprimir la marca de tiempo en el eje x para cada barra:

 xAxes:[{ marcas:{ autoSkip:false, maxTicksLimit:24 }

La opción predeterminada (con autoSkip establecido en verdadero) resultó en un par de espacios en blanco extraños en las etiquetas. Deberá cambiar maxTicksLimit si desea mostrar algo que no sea 24 entradas.

Si desea más ayuda para cambiar cualquiera de las opciones de chart.js o no puede obtener lo que desea que funcione, consulte las páginas específicas de desbordamiento de pila de chart.js; hay mucha información útil allí:https://stackoverflow .com/questions/tagged/chart.js:solo use el cuadro de búsqueda para reducir lo que está buscando. Desafortunadamente, la documentación de chart.js carece de algunos de los ejemplos más avanzados que sin duda serían de gran ayuda para ponerse al día con el uso de esta excelente pieza de código abierto.

15 Manejo de errores

Durante mis ejecuciones de prueba iniciales, noté un par de veces que Speedtest informó "No se puede recuperar la lista de servidores Speedtest" en el archivo CSV. Presumiblemente, esto reflejaba los momentos en que mi conexión de banda ancha era tan mala que Speedtest no podía conectarse al servidor de prueba. Obviamente, este texto no está en un formato que queramos importar a la base de datos de SQLite, por lo que necesitaba una solución que eliminara este texto no deseado del archivo CSV y también incluyera una entrada cero en la base de datos para el intervalo de tiempo específico. ya que, de lo contrario, cualquier entrada faltante en la tabla SQL simplemente sería invisible y también eliminaría la alineación que quería de tener 24 entradas por día al crear el gráfico.

Verá en ancho de banda.sh que la secuencia de comandos prueba el código de salida establecido por speedtest utilizando la variable de secuencia de comandos $? y si es mayor que cero indica que la prueba de velocidad falló. Esto activará la función para crear una entrada CSV ficticia, que luego se usa para sobrescribir el archivo CSV para esa ejecución.

Hay un par de líneas en la secuencia de comandos bash que están comentadas pero que probarán esta rutina de error para generar una entrada cero ficticia si ejecuta la secuencia de comandos después de descomentar esas líneas.

########################################## prueba/ caso de depuración:obliga a la prueba de velocidad a fallar######################################## ## ejecutar prueba "199999999"# dormir 5####### comentar después de probar ############################ ######################

Esto utiliza una identificación de servidor 'sin sentido' que a speedtest no le gusta, lo que hace que devuelva un código de salida distinto de cero. La secuencia de comandos debería crear una entrada ficticia que pueda sentarse felizmente en la tabla SQL y ser ignorada o podría eliminarla.

Otra forma de forzar la falla de Speedtest, para este propósito de prueba, sería eliminar la conexión de red del servidor. No olvide que puede ejecutar el script de ancho de banda.sh manualmente en cualquier momento, no tiene que esperar a que el cronjob lo active, aunque debe evitar ejecutarlo manualmente si un cronjob es inminente. Es probable que tener dos scripts ejecutándose simultáneamente estropee los archivos CSV y luego la tabla SQL.

Si sucede lo peor, hay un archivo CSV de respaldo guardado como /usr/local/etc/speedtest.bak que debe contener toda la salida CSV de speedtest desde la primera ejecución del script bash en adelante. Esto podría editarse para eliminar cualquiera de las entradas no deseadas, borrar la tabla SQL y luego volver a importar todo el conjunto de entradas CSV a SQLite.

16 Zonas horarias

Speedtest informa la hora en UTC (básicamente, esto es lo mismo que la hora media de Greenwich o GMT). Usar UTC significa que todas las horas almacenadas en la tabla SQL son consistentes y el horario de verano no tendrá ningún impacto no deseado.

Pero esto significa que la rutina de manejo de errores en ancho de banda.sh necesita crear una marca de tiempo para que la entrada ficticia refleje esto. Esto es bastante simple:solo incluimos el indicador --utc:

local RIGHTNOW=$(fecha --utc +%Y-%m-%dT%H:%M:%SZ)

Si desea que las etiquetas del eje x del gráfico muestren las horas como algo diferente a UTC/GMT, entonces el mejor lugar para realizar dicho cambio sería en la instrucción SQL SELECT, por ejemplo:

strftime("%H:%M", time(times, 'localtime')) || " " || strftime("%d/%m/%Y", times) COMO marca de tiempo

Esto usaría la configuración de la zona horaria de su servidor Linux para ajustar los tiempos que se muestran en el gráfico. O podría sumergirse para descubrir cómo Globalize podría hacer esto en el front-end.

Consulte https://www.timeanddate.com/time/gmt-utc-time.html y http://www.tutorialspoint.com/sqlite/sqlite_date_time.htm para obtener más información.

17 Más pasos e ideas

Speedtest no necesita ser la fuente de sus datos sin procesar; podría provenir de cualquier lugar y ser para cualquier cosa, no solo para la velocidad de Internet. El principio es el mismo:un proceso de servidor back-end que puede obtener los datos sin procesar en un formato útil y luego importarlos a SQLite desde un script bash con un front-end que extrae el subconjunto de datos que desea y luego lo grafica.

Un script bash más complejo podría escribir datos directamente en una tabla SQL (usando el comando SQL INSERT) si formatear como CSV no es una opción. Cuando diseñe la tabla SQL, piense en cómo puede extraer los datos más adelante.

Al realizar cualquier cambio, tenga en cuenta el contexto del código que está editando; es decir, tenemos instrucciones SQL dentro del script PHP dentro de Javascript dentro de HTML. Recuerde el nivel en el que se encuentra y codifique en consecuencia. ¡Puede ser fácil perder el hilo y terminar escribiendo código PHP en lo que debería ser Javascript! Puedo garantizar que esto no funcionará.

Aquí hay algunas ideas para una mayor exploración:

  • toLocaleString no se implementa de manera consistente en todos los navegadores. Use Globalize y maneje todos los formatos de número, fecha y zona horaria con él.
  • Checkout httpstat (hay una versión de bash script) que permite recopilar diferentes tipos de datos de conexión a Internet. Almacene esto en una tabla SQL (separada) y grafique la salida.
  • Mejore la interfaz de usuario de width.php para que el usuario pueda elegir entre diferentes opciones:24, 48, 72 horas; seleccione una fecha específica, incluya datos de carga y descarga, tiempos de ping.
  • Convierta el HTML para usar código Bootstrap receptivo para que funcione bien en diferentes dispositivos o tamaños de pantalla.
  • Explore algunas de las otras opciones de chart.js; tal vez un gráfico combinado de líneas y barras; cambia los colores y el tamaño de la barra.
  • reemplace SQLite con MySQL y agregue más seguridad con acceso de lectura desde PHP a través de usuario/contraseña.
  • Cree un sistema similar pero usando node.js.

18 enlaces

  • prueba de velocidad:https://github.com/sivel/speedtest-cli
  • SQLite3:https://sqlite.org/
  • chart.js:http://www.chartjs.org/
  • Globalizar:https://github.com/globalizejs/globalize
  • httpsstat:https://github.com/b4b4r07/httpsstat
  • Bootstrap:http://getbootstrap.com/
  • PHP:http://www.php.net/
  • ISPConfig:http://www.ispconfig.org/
  • Debian:http://www.debian.org/

Linux
  1. Cómo configurar y usar el servidor FTP en Ubuntu Linux

  2. ¿Qué es un comando Chown en Linux y cómo usarlo?

  3. Cómo instalar y usar Flatpak en Linux

  4. Cómo instalar y usar Traceroute en Linux

  5. Cómo instalar y usar la herramienta de línea de comandos Mosh Linux

Cómo verificar la velocidad de Internet en Linux usando Speedtest CLI

Cómo instalar y usar phpMyAdmin en Linux

Cómo comprobar la velocidad de Internet en Linux

Cómo instalar y usar el comando fd en Linux

Cómo instalar y usar Nu Shell en Linux

Cómo instalar y usar el servidor Xrdp (escritorio remoto) en el sistema Linux