GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So verwenden Sie Speedtest auf einem Linux-Server, um Internetgeschwindigkeiten grafisch zu überprüfen, zu speichern und zu melden

Nach einer Reihe von Problemen mit schlechter Breitbandverbindung, die ich hatte, beschloss ich, die Mbit/s-Geschwindigkeit, die ich von meinem Anbieter erhielt, regelmäßig zu überwachen. Ich sah besonders schlechte Zahlen, wenn ich versuchte, Dateien am Abend herunterzuladen, wobei viel schnellere Geschwindigkeiten sehr früh am Morgen erreicht wurden.

Ich habe einen Linux-Debian-Server in einer Ecke, der meine Test- und Entwicklungsmaschine für von ISPConfig gehostete Websites ist, sowie etwas Let's Encrypt-Code, mit dem ich gerne herumspiele, also suchte ich nach einer Software, die Bandbreitentests ermöglichen würde. von einer Linux-Befehlszeile ausführbar, die die Grundlage für ein automatisiertes Shell-Skriptsystem bilden könnte, um die von mir benötigten Rohdaten zu erzeugen. Ich wollte die Daten in einer SQL-Datenbank speichern, um Abfragen zu vereinfachen (ich könnte dann problemlos mehr Daten sammeln und nur eine kleinere Teilmenge für Zeiträume extrahieren, die mich interessieren) und um ein Web-Frontend zu haben, das ein einfaches Diagramm erstellen kann um die Daten zu visualisieren und die Konnektivitätsprobleme hervorzuheben.

Das erste Ergebnis meiner Suche war der wirklich nützliche Artikel von Antonio Valencia unter:https://www.howtoforge.com/tutorial/check-internet-speed-with-speedtest-cli-on-ubuntu/

Nachdem ich den dortigen Anweisungen zur Installation von Speedtest gefolgt war, zeigte ein schnelles Spiel, dass ich damit Tests gegen eine Vielzahl von Internetservern durchführen und auch eine Ausgabe im CSV-Format erzeugen konnte, das sich gut zum direkten Importieren in eine SQL-Tabelle eignet den minimalen Aufwand in der Softwareentwicklung.

Für die relativ kleine Datenmenge, die generiert werden würde, entschied ich mich für die Verwendung von SQLite als Back-End-Speicher, und eine schnelle Suche nach den verfügbaren Open-Source-Javascript-basierten Grafikbibliotheken führte mich zu chart.js, das ein einfaches, sauberes Design hat mit einer einfachen Datenschnittstelle, aber vielen Möglichkeiten, erweiterte Optionen bei Bedarf zu optimieren. Das Konvertieren von SQL-Daten, um nur die Teilmenge von Daten zu extrahieren, die ich mit der Ausgabe über JSON über einen einfachen PHP-Code grafisch darstellen wollte, war der richtige Weg.

Insgesamt musste ich also ein System entwerfen, das so aussah:

Ein Linux-Server, auf dem Speedtest als Cronjob ausgeführt wird - vielleicht 1 pro Stunde -, wobei die Speedtest-Ausgabe in einer SQLite-Datenbank gespeichert wird - alles gesteuert von einer Bash-Shell-Skriptdatei. Ein Web-Frontend, das eine Mischung aus HTML, CSS, Javascript und PHP ist, um Daten aus SQLite zu extrahieren und ein Balkendiagramm zu erstellen, das die erreichten Mbps-Zahlen für die letzten 24 Stunden (oder einen anderen Zeitraum, für den ich mich entscheiden könnte) zeigt.

Ein wenig herumexperimentieren mit interaktivem Speedtest etwa ein Dutzend Mal zeigte mir, dass einige Server verfügbar waren, die Ergebnisse zu liefern schienen, die eng mit der Art von Geschwindigkeit übereinstimmten, die ich erlebte. Ich hielt es für eine gute Idee, mit mehr als einem Server zu testen, um besser zu verstehen, wie meine Mbit/s-Zahlen vom Standort des Zielservers und der Tageszeit in einer anderen Zeitzone beeinflusst werden.

Wenn Sie mitmachen und ein ähnliches System für sich selbst einrichten möchten, müssen Sie einen oder mehrere Server aus den Hunderten von verfügbaren Speedtest-Servern auswählen, die für Ihren Standort geeignet sind.

1 Voraussetzungen

  • ein Linux-Server - ich verwende Debian 9.1 - stretch
  • Tty-Zugriff auf den Server mit Root-Login - ich verwende PuTTY von einem Windows-Laptop aus
  • ISPConfig installiert und eine Website auch mit einem FTP-Konto konfiguriert - ich verwende 3.1.6 mit Apache als Webserver (Sie könnten mit nur einem Webserver auskommen, mit ein paar geringfügigen Änderungen an den folgenden Anweisungen)
  • PHP - Ich verwende 7.0, aber das sollte auch mit den meisten früheren Versionen funktionieren
  • FTP-Client - ich verwende Filezilla - und PureFTPd läuft auf dem Server
  • nano - oder Ihr bevorzugter visueller Editor

Ich gehe hier davon aus, dass Sie mit der Anmeldung bei einem Linux-Server vertraut sind, wissen, wie Sie die Verzeichnisse umgehen, das Layout, wo Ihr Webserver Dateien erwartet, und wie Sie Dateien per FTP in diese Verzeichnisse schicken.

Hier sind die detaillierten Schritte, mit denen Sie all dies einrichten können.

2 Speedtest installieren

Melden Sie sich als root bei Ihrem Linux-Server an und führen Sie den folgenden Befehl aus:

# pip install speedtest-cli

Siehe https://www.howtoforge.com/tutorial/check-internet-speed-with-speedtest-cli-on-ubuntu/ und https://pypi.python.org/pypi/speedtest-cli für weitere Informationen, wenn Sie Probleme haben.

Hinweis:speedtest und speedtest-cli sind bei meiner Installation identisch, daher werde ich im Folgenden nur auf speedtest verweisen.

3 Installieren Sie SQLite3

# apt-get install sqlite3

Verwenden Sie das Äquivalent für Ihre Distribution, wenn apt-get nichts für Sie ist.

4 Bandbreite.sh erstellen

Geben Sie den folgenden Bash-Skriptcode in eine Datei ein und speichern Sie sie als /usr/local/etc/bandwidth.sh - wir werden dies etwas später bearbeiten, um es speziell für Sie zu machen.

#!/bin/bash# Geschwindigkeitstests gegen 3 Server ausführen und alle Ausgabeergebnisse in einer CSV-Datei zum Importieren in sqlite db## einmal pro Stunde von Cronjob ausführen##function getCSVString () { # wenn Speedtest fehlgeschlagen ist (z konnte nicht auf einen Server zugreifen) müssen wir einen Dummy-Null-Eintrag für dieses Zeitfenster erstellen # erhalten Sie eine Zeitstempel-Zeichenfolge im gleichen Format, das Speedtest generiert - und wir brauchen UTC-Zeit lokal RIGHTNOW=$(date --utc +%Y- %m-%dT%H:%M:%SZ) # Auf welchem ​​Server testen wir? if [ $1 ="5443" ] then echo "5443,Fasthosts Internet,Gloucester,$RIGHTNOW,73.09,0.0,0.0,0.0" fi if [ $1 ="1234" ] then echo "1234,Uno,Milton Keynes,$RIGHTNOW ,168.27,0.0,0.0,0.0" fi if [ $1 ="1783" ] then echo "1783,Comcast,\"San Francisco, CA\",$RIGHTNOW,8420.0,0.0,0.0,0.0" fi # test/debug case only if [ $1 ="199999999" ] then echo "99999,Test,Test,$RIGHTNOW,99.99,0.0,0.0,0.0" fi}function runTest () { # Speedtest gegen benannten Server mit in tmp-Datei gespeicherter CSV-Ausgabe ausführen /usr/local/bin/speedtest --csv --server $1> /usr/local/etc/speedtest.tmp if [ $? -gt 0 ] dann # Speedtest fehlgeschlagen, also erstelle einen Nulleintrag anstelle einer Fehlermeldung getCSVString $1> /usr/local/etc/speedtest.tmp fi # speichere die Ausgabe bereit für den nächsten Servertest cat /usr/local/etc/speedtest .tmp>
> /usr/local/etc/speedtest.csv}# main######## Speedtest gegen 3 Server ausführen und alle Ausgabeergebnisse in csv-Datei speicherncd /usr/local/etc# csv-Datei löschen - benötigt muss beim Start von runrm leer sein -f /usr/local/etc/speedtest.csv############################## ############# Test-/Debug-Fall - zwingt Speedtest zum Fehlschlagen ######################### ################# runTest "199999999"# sleep 5####### nach dem Test auskommentieren ############# ########################################RunTest "5443"sleep 10RunTest "1234"sleep 10runTest "1783"sleep 1# importiere jetzt die CSV-Daten in sqlite dbsqlite3 -batch /usr/local/etc/bandwidth.db <<"EOF".separator ",".import /usr/local/etc/speedtest.csv BandbreiteEOF# CSV der aktuellen Ausführung zu backupcat hinzufügen /usr/local/etc/speedtest.csv>> /usr/local/etc/speedtest.bak

Ich entschuldige mich für meinen "Gürtel und Hosenträger"-Ansatz, überall vollständige Pfade für Dateien zu verwenden, auch wenn sie nicht benötigt werden. Es ist einfach so, wie ich es gerne mache. Fühlen Sie sich frei, dies zu verbessern, wenn Sie mit der Bearbeitung von Bash-Skripten vertraut sind.

Legen Sie die Dateieigenschaften fest, um dieses Skript ausführbar zu machen:

# chmod 0700bandbreite.sh

5 Erstellen Sie eine SQLite-Datenbank

Erstellen Sie die SQLite-Datenbank „bandwidth.db“ in /usr/local/etc :

#sqlite3-Bandbreite.db

und erstellen Sie dann am sqlite>-Prompt eine neue Tabelle mit dem folgenden Befehl (verpassen Sie nicht das abschließende Semikolon):

sqlite> CREATE TABLE IF NOT EXISTS "bandwidth" ("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 , "download" FLOAT NOT NULL , "upload" FLOAT NOT NULL );
sqlite> .quit

Dadurch wird eine Tabelle namens Bandbreite mit Feldern erstellt, die direkt der CSV-Formatausgabe von Speedtest zugeordnet werden.

6 Serverliste abrufen

Sie benötigen eine Liste der Server, die Speedtest verwendet.

# speedtest --list> server.txt

Suchen Sie nun in der Datei „servers.txt“ nach den numerischen IDs der Server, auf denen Sie Ihre Tests durchführen möchten.

# Nanoserver.txt

Die Datei sieht etwa so aus:

Speedtest.net-Konfiguration wird abgerufen... 5833) Hub Network Services Ltd (Newport, Wales) [57,50 km] 5938) Spectrum Internet (Cardiff, Großbritannien) [65,89 km] 5443) Fasthosts Internet (Gloucester, Großbritannien) [74,31 km] 6504) Secure Web Services Ltd (Shrewsbury, Großbritannien) [78,64 km] 7265) Unitron Systems &Development Ltd (Telford, Großbritannien) [87,11 km] 8225) Exascale Limited (Wolverhampton, Großbritannien) [96,08 km ] 3110) zero.net.uk Ltd (Studley, Großbritannien) [96,12 km] 12401) Dragon WiFi LTD (Haverfordwest, Vereinigtes Königreich) [120,78 km] 1153) Warwicknet Ltd. (Coventry, Großbritannien) [125,18 km] 1685 ) Vodafone UK (Newbury, Großbritannien) [153,25 km] 4384) Iomart (Leicester, Großbritannien) [157,40 km] 1234) Uno (Milton Keynes, Großbritannien) [170,71 km] 3504) TNP Ltd. (Manchester, Großbritannien ) [170,93 km]11747) Vispa (Manchester, Vereinigtes Königreich) [170,93 km]

Die Server-IDs befinden sich auf der linken Seite. Die Zahl am Ende jeder Zeile ist die Schätzung, die Speedtest für die Entfernung in Kilometern zwischen Ihrem Standort und dem des Servers vorgenommen hat, obwohl ich nicht sicher bin, ob sie zu genau ist und sich von Lauf zu Lauf ändern kann. Die Testserver werden in der Reihenfolge dieser Entfernung aufgelistet, beginnend mit dem nächstgelegenen. Das Testen mit den Servern ganz oben auf dieser Liste sollte Ihnen theoretisch die schnellsten Pings und die besten Download- und Upload-Geschwindigkeiten im Vergleich zu Servern weiter unten in der Liste liefern, die viel weiter entfernt sind.

7 Wählen Sie Server-IDs aus und bearbeiten Sie die Datei „bandwidth.sh“

Jetzt wäre es an der Zeit, den Speedtest manuell gegen eine Auswahl der verschiedenen verfügbaren Server-IDs auszuführen und zu sehen, welche Art von Ergebnissen Sie erhalten. Ich habe ein paar Server in meiner Nähe in Großbritannien und einen in Kalifornien zum Vergleich ausgewählt. Das Format des zu verwendenden Befehls ist:

# speedtest --server 1234

Die Ausgabe, die Sie sehen, sieht ähnlich aus wie:

Speedtest.net-Konfiguration abrufen...Testen von xxxxxxx (n.n.n.n)...Speedtest.net-Serverliste abrufen...Besten Server basierend auf Ping auswählen...Gehostet von Uno (Milton Keynes) [187,87 km]:33.243 msDownload-Geschwindigkeit wird getestet....................................... ...................................Download:1,60 Mbit/sUpload-Geschwindigkeit wird getestet........ .................................................... ......................................Upload:0,55 Mbit/s

Sobald Sie die Server ausgewählt haben, die Sie verwenden möchten, geben Sie die numerischen Server-IDs (ich habe 3 Server verwendet, aber Sie können dies ändern, wenn Sie dies wünschen) in die entsprechenden Zeilen inbandbreite.sh

ein
runTest "5443"sleep 10runTest "1234"sleep 10runTest "1783"sleep 1

Sie müssen auch den Code in der Fehlerroutine anpassen, die einen Dummy-Eintrag erstellt, wenn der Speedtest bei einem bestimmten Lauf fehlschlagen sollte.

 # Auf welchem ​​Server testen wir? if [ $1 ="5443" ] then echo "5443,Fasthosts Internet,Gloucester,$RIGHTNOW,73.09,0.0,0.0,0.0" fi if [ $1 ="1234" ] then echo "1234,Uno,Milton Keynes,$RIGHTNOW ,168.27,0.0,0.0,0.0" fi if [ $1 ="1783" ] then echo "1783,Comcast,\"San Francisco, CA\",$RIGHTNOW,8420.0,0.0,0.0,0.0" fi

Die Zahlen nach $RIGHTNOW darin (z. B. 73,09) sind die Entfernungen in Kilometern von Ihrem Standort zum betreffenden Server. Ich verwende diese nirgendwo, also sind sie nur ein Platzhalter und könnten ein beliebiger numerischer Wert sein.

Beachten Sie bei diesem Beispiel von 1783, dass wir den Speicherort in Anführungszeichen setzen und mit Escapezeichen versehen müssen, um sie in die von uns erstellte CSV-Datei zu übernehmen. Die Anführungszeichen sind hier erforderlich, da diese Stelle zufällig ein Komma enthält. Ohne die maskierten Anführungszeichen würde das Komma als CSV-Feldtrenner behandelt, was zu Problemen beim SQLite-Import führen würde. Wenn der von Ihnen ausgewählte Server einen ähnlichen Standorttext mit einem Komma enthält, müssen Sie die Escape-Anführungszeichen verwenden.

8 Richten Sie einen Cronjob ein

Richten Sie einen Cronjob ein, der einmal pro Stunde ausgeführt wird (oder so oft Sie möchten, innerhalb eines angemessenen Rahmens), um /usr/local/etc/bandwidth.sh auszuführen. Wenn Sie ISPConfig ausführen, können Sie damit einen Cronjob planen.

Alternativ können Sie in der Linux-Befehlszeile Folgendes eingeben:

# crontab -e

Sie sollten etwas Ähnliches sehen (denken Sie daran, dass Sie als „root“ angemeldet sind):

* * * * * /usr/local/ispconfig/server/server.sh 2>&1 | während Lesezeile; do echo `/bin/date` "$line">> /var/log/ispconfig/cron.log; done* * * * * /usr/local/ispconfig/server/cron.sh 2>&1 | während Lesezeile; do echo `/bin/date` "$line">> /var/log/ispconfig/cron.log; done1 * * * * /usr/local/etc/bandwidth.sh 2>&1

Wenn Sie ISPConfig nicht ausführen, kann dies zunächst leer sein. Fügen Sie diese letzte Zeile genau wie oben gezeigt hinzu - der Abstand ist wichtig -, um das Shell-Skript ab 00:01 Uhr auszuführen und dann jeden Tag stündlich zu wiederholen. Sie können natürlich auch andere Zeiten wählen. (Beim allerersten Mal, wenn Sie dies ausführen, wird crontab Sie fragen, welchen Editor Sie verwenden möchten – ich wähle Nano.)

9 Legen Sie PHP open_basedir fest

Fügen Sie /usr/local/etc zum PHP open_basedir-Eintrag für die Website hinzu. In ISPConfig ist dies auf der Registerkarte Optionen für die Website zu finden.

Dadurch kann der width.php-Code auf die SQLite-Datenbank zugreifen, die wir gerade in diesem Verzeichnis erstellt haben.

Wir hätten dies überspringen können, wenn wir uns entschieden hätten, die Datenbank in einem Verzeichnis zu erstellen, das bereits als zugänglich festgelegt ist, z. B. /var/www/clients/client1/web1/web/, aber das wäre aus Sicherheitsgründen eine schlechte Wahl .

10 Bandbreite.php erstellen

Sie müssen diesen Code in eine Datei namens „bandwidth.php“ auf Ihrem Server im Basisverzeichnis für Webdokumente kopieren. Wenn Sie ISPConfig verwenden, ist dies so etwas wie /var/www/clients/client1/web1/web/

   Bandwidth Monitor - Downloadgeschwindigkeiten in den letzten 24 Stunden

Downloadgeschwindigkeiten - letzte 24 Stunden

Bearbeiten Sie diese Datei, um die Server-ID zu verwenden, über die Sie berichten möchten. Ich verwende hier in meinem Beispiel den Server 1234, da ich festgestellt habe, dass dieser Server, nachdem ich einige Tage lang Daten untersucht hatte, Mbit / s-Zahlen produzierte, die am ehesten mit den Geschwindigkeiten übereinstimmten, die ich meiner Meinung nach erreichte. Die Server-ID befindet sich in der WHERE-Klausel der SQL SELECT-Anweisung:

SELECT serverid, strftime("%H:%M", times) || " " || strftime("%d/%m/%Y", Zeiten) AS Zeitstempel, Sponsor, Servername, 
Download
FROM Bandbreite
WHERE Serverid =1234
ORDER BY Zeiten
ORDER BY Zeiten
/>LIMIT 24 OFFSET (SELECT COUNT(*)/3 VON Bandbreite)-24;

Was genau macht diese SQL-Anweisung? Wenn Sie mit SQL nicht vertraut sind, schauen wir uns die einzelnen Teile an.

a. SELECT ist der Befehl zum Lesen von Datensätzen aus einer SQL-Datenbanktabelle, gefolgt von den zu lesenden Feldern und anderen Optionen.

b. strftime("%H:%M", Zeiten) || " " || strftime("%d/%m/%Y", times) AS Zeitstempel

besteht darin, den datetime-String, den Speedtest in seiner CSV-Ausgabe erstellt hat, etwas benutzerfreundlicher zu formatieren. Ich möchte Daten im britischen Format, damit dies eine Zeichenfolge wie "2017-08-31T12:02:51.898186Z" in "12:02 31/08/2017" umwandelt. Es ist einfacher, diese Neuformatierung direkt in der SQL-Anweisung vorzunehmen, als sie nachträglich verarbeiten zu müssen. Die Zeiten hier werden UTC/GMT sein, was für mich in Ordnung ist, aber Sie möchten dies vielleicht ändern; z.B. Wenn Sie Datumsangaben im US-Format wünschen, ändern Sie diesen zweiten Teil in strftime("%m/%d/%Y", times).

c. serverid, timestamp, sponsor, servername, download sind die Felder, die wir aus der SQL-Tabelle lesen und in unserem JSON-Objekt erstellen möchten.

d. FROM-Bandbreite ist der Name der SQL-Tabelle, aus der wir lesen.

e. WHERE serverid =1234 legt die zu lesende Teilmenge der Tabelle fest - ändern Sie dies so, dass sie mit der von Ihnen verwendeten serverid übereinstimmt, und Sie möchten vielleicht Daten für mehr als einen Server lesen - aber das wird das Diagramm verkomplizieren.

f. ORDER BY times legt die Sortierreihenfolge der Ausgabe fest - wir wollen, dass sie nach dem Zeitstempel sortiert wird, den der Speedtest für jeden Lauf gesetzt hat.

g. LIMIT 24 beschränkt die Ausgabe auf 24 Datensätze, da wir nur Daten von 24 Stunden anzeigen möchten und weil unser Cronjob so eingestellt ist, dass er einmal pro Stunde ausgeführt wird. Wenn Sie zweimal pro Stunde laufen würden, müssten Sie dies auf 48 setzen, um 24 Stunden Daten zu erhalten.

h. OFFSET (SELECT COUNT(*)/3 VON Bandbreite)-24; wir wollen die letzten 24 Datensätze aus der Tabelle, da sie die neuesten Einträge sind, an denen wir interessiert sind, also müssen wir einen OFFSET angeben, um mit dem LIMIT übereinzustimmen. Ohne dies würden wir immer die ersten 24 Datensätze in der Tabelle erhalten und nicht die 24 neuesten. Um den richtigen Offset zu erhalten, zählen wir alle Datensätze in der Tabelle mit (SELECT COUNT(*)), dividieren dies dann durch 3 (da wir den Speedtest 3 Mal pro Stunde durchführen, einmal für jeden der 3 verschiedenen Server) und subtrahieren dann 24 von dieser Summe, um die richtige OFFSET-Position zu erhalten, damit LIMIT 24 dann die gewünschten Datensätze erhält.

Wenn Sie das Bash-Skript geändert haben, um etwas anderes als 3 verschiedene Servertests pro Stunde auszuführen, passen Sie diesen /3-Teil entsprechend an. Wenn Sie nur gegen einen Server testen, ist die Division überhaupt nicht erforderlich.

Möglicherweise möchten Sie auch die Gesamtgröße des Diagramms anpassen, wobei ich den einfachen Weg eingeschlagen habe, eine für meinen Bildschirm geeignete Größe fest zu codieren - sie wird in dieser Zeile festgelegt:

11 Erhalten Sie eine lokale Kopie von Dateien

Ich bevorzuge lokale Versionen aller CSS- und JS-Bibliotheksdateien (aber keine Google-Schriftarten), die auf einer Webseite benötigt werden, und wenn Sie dasselbe sind, müssen Sie eine Kopie von Chart.bundle.min auf Ihrem Server erhalten. js und platzieren Sie es im Verzeichnis /var/www/clients/client1/web1/web/scripts auf Ihrem Server (oder welches Basisverzeichnis auch immer für Sie geeignet ist).

Sie können die Datei herunterladen von:https://cdnjs.cloudflare.com/ajax/libs/Chartajs/2.6.0/Chart.bundle.min.js

Wenn Sie keine lokale Kopie verwenden möchten, bearbeiten Sie die width.php so, dass sie stattdessen auf die öffentliche CDN-Version verweist. Ändern Sie einfach diese Zeile:

dazu:

12 Aktivieren Sie PHP in ISPConfig

Vergessen Sie nicht, PHP in Ihren Website-Einstellungen zu aktivieren, falls dies noch nicht geschehen ist.

13 Bandbreite.php im Browser laden

Wir sind endlich fertig. Nachdem das Shell-Skript „bandwidth.sh“ einige Male ausgeführt werden musste, um einige Daten zu generieren (oder Sie könnten es zunächst mehrmals manuell ausführen), richten Sie Ihren Browser auf Ihre Linux-Server-Website, laden Sie „bandwidth.php“ und Sie sollten so etwas wie „ das:

Und ja, mein Breitband ist wirklich so schlecht!

Zum Schluss noch ein paar zusätzliche Punkte, die es wert sind, erwähnt zu werden:

14 Balkendiagrammausgabe

Wir sollten beachten, dass die in der SQL-Tabelle gespeicherten Download- und Upload-Zahlen in bps und nicht in Mbps angegeben sind (zusammen mit einer verwirrenden Anzahl von Dezimalstellen - Zahlen wie 1533681.5922415722). Auf diese Weise erzeugt Speedtest die Daten, wenn er im CSV-Modus ausgeführt wird. Um die Mbit/s-Zahl anstelle von Bps auf der y-Achsenausgabe des Balkendiagramms anzuzeigen, enthält der Javascript-Code inbandbreite.php ein paar Zeilen, um die Konvertierung durchzuführen:

 mbps =Math.round(bandwidth_data[i].download/1000).toFixed(3)/1000; bvalue =mbps.toLocaleString(undefined, { minimumFractionDigits:3 });

Die Verwendung von toLocaleString sollte die korrekte dezimale Radix-Interpunktion (ein "." oder ",") einfügen, wie sie von der Gebietsschemaeinstellung Ihres Browsers festgelegt wird, aber dies ist implementierungsabhängig und etwas inkonsistent. Wenn du siehst . statt , und es ärgert Sie, dann ist Globalize der Weg, dies zu beheben. Siehe '18 Weitere Schritte und Ideen' weiter unten.

Ein paar weitere Zeilen sind erforderlich, um die standardmäßige Hover-Code-Behandlung von nachgestellten Nullen zu überschreiben, da chart.js normalerweise "2.000" nur als "2" anzeigt, was nicht das ist, was ich will, besonders nachdem ich mir die Mühe gemacht habe sicherstellen, dass sie überhaupt vorhanden sind:

 // wir überschreiben den Standard-Tooltip, der nachgestellte Nullen auslässt, obwohl wir sie bereits dort eingefügt haben Tooltips:{ callbacks:{ label:function(tooltipItem, data) { var value =data.datasets[0].data[ tooltipItem.index]; var label ='herunterladen:'; var retvalue =value.toLocaleString(undefined, { minimumFractionDigits:3 }); Rückgabelabel + ' ' + Retvalue + ' Mbps'; } } },

Dies ist ein nettes Beispiel dafür, wie Sie chart.js „aufschlüsseln“ und die Art und Weise ändern können, wie es Dinge tut.

Außerdem habe ich die Diagrammoptionen so eingestellt, dass für jeden Balken der Zeitstempel auf der x-Achse gedruckt wird:

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

Die Standardoption (mit autoSkip auf „true“ gesetzt) ​​führte zu einigen seltsam aussehenden Lücken in den Beschriftungen. Sie müssen maxTicksLimit ändern, wenn Sie etwas anderes als 24 Einträge anzeigen möchten.

Wenn Sie weitere Hilfe beim Ändern einer der chart.js-Optionen benötigen oder nicht das bekommen, was Sie arbeiten möchten, dann sehen Sie sich bitte die spezifischen chart.js-Stack-Overflow-Seiten an – dort finden Sie viele nützliche Informationen – https://stackoverflow .com/questions/tagged/chart.js – Verwenden Sie einfach das Suchfeld, um einzugrenzen, wonach Sie suchen. Leider fehlen in der chart.js-Dokumentation einige der fortgeschritteneren Beispiele, die sicherlich eine große Hilfe wären, um sich mit diesem großartigen Stück Open-Source-Code vertraut zu machen.

15 Fehlerbehandlung

Während meiner ersten Testläufe ist mir ein paar Mal aufgefallen, dass Speedtest in der CSV-Datei „Cannot retrieve speedtest server list“ gemeldet hat. Vermutlich spiegelte dies die Zeiten wider, in denen meine Breitbandverbindung so schlecht war, dass Speedtest überhaupt keine Verbindung zum Testserver herstellen konnte. Dieser Text ist offensichtlich nicht in einem Format, das wir in die SQLite-Datenbank importieren möchten, also brauchte ich eine Lösung dafür, die sowohl diesen unerwünschten Text aus der CSV-Datei löscht als auch einen Nulleintrag in der Datenbank für das spezifische Zeitfenster enthält, da sonst jeder fehlende Eintrag in der SQL-Tabelle einfach unsichtbar wäre und auch die von mir gewünschte Ausrichtung von 24 Einträgen pro Tag beim Erstellen des Diagramms zunichte macht.

Sie werden inbandbreite.sh sehen, dass das Skript den von speedtest gesetzten Exit-Code mit der Skriptvariable $? testet. und wenn es größer als Null ist, zeigt dies an, dass der Speedtest fehlgeschlagen ist. Dadurch wird die Funktion ausgelöst, um einen Dummy-CSV-Eintrag zu erstellen, der dann zum Überschreiben der CSV-Datei für diesen Lauf verwendet wird.

Es gibt ein paar Zeilen im Bash-Skript, die auskommentiert sind, aber diese Fehlerroutine testen, um einen Dummy-Null-Eintrag zu erzeugen, wenn Sie das Skript ausführen, nachdem Sie diese Zeilen auskommentiert haben.

############################################ test/ Debug-Fall - zwingt Speedtest zum Scheitern ############################################# ## runTest "199999999"# sleep 5####### auskommentieren nach dem Test ############################## ########################

Dies verwendet eine "unsinnige" Server-ID, die Speedtest nicht mag, wodurch ein Exit-Code ungleich Null zurückgegeben wird. Das Skript sollte dann einen Dummy-Eintrag erstellen, der problemlos in der SQL-Tabelle sitzen und ignoriert werden kann, oder Sie könnten ihn löschen.

Eine andere Möglichkeit, den Speedtest für diesen Testzweck zum Scheitern zu bringen, besteht darin, die Netzwerkverbindung des Servers zu entfernen. Vergessen Sie nicht, dass Sie das Skript „bandwidth.sh“ jederzeit manuell ausführen können, Sie müssen nicht warten, bis der Cronjob es auslöst, obwohl Sie es vermeiden sollten, es manuell auszuführen, wenn ein Cronjob bevorsteht. Wenn zwei Skripte gleichzeitig ausgeführt werden, würde dies wahrscheinlich die CSV-Dateien und dann die SQL-Tabelle durcheinander bringen.

Wenn das Schlimmste passiert, gibt es eine Backup-CSV-Datei, die als /usr/local/etc/speedtest.bak gespeichert wird und die alle CSV-Ausgaben von Speedtest ab der ersten Ausführung des Bash-Skripts enthalten sollte. Dies könnte bearbeitet werden, um alle unerwünschten Einträge zu entfernen, die SQL-Tabelle gelöscht und dann der gesamte Satz von CSV-Einträgen erneut in SQLite importiert werden.

16 Zeitzonen

Speedtest meldet die Zeit in UTC (im Grunde ist dies dasselbe wie Greenwich Mean Time oder GMT). Die Verwendung von UTC bedeutet, dass alle in der SQL-Tabelle gespeicherten Zeiten konsistent sind und die Sommerzeit keine unerwünschten Auswirkungen hat.

Das bedeutet aber, dass die Fehlerbehandlungsroutine inbandbreite.sh einen Zeitstempel für den Dummy-Eintrag erstellen muss, um dies widerzuspiegeln. Das ist ziemlich einfach – wir haben gerade das Flag --utc eingefügt:

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

Wenn Sie möchten, dass die X-Achsen-Beschriftungen des Diagramms andere Zeiten als UTC/GMT anzeigen, dann ist der beste Ort für eine solche Änderung die SQL SELECT-Anweisung, z. B.:

strftime("%H:%M", time(times, 'localtime')) || " " || strftime("%d/%m/%Y", times) AS Zeitstempel

Dies würde die Zeitzoneneinstellungen Ihres Linux-Servers verwenden, um die im Diagramm angezeigten Zeiten anzupassen. Oder Sie könnten eintauchen, um herauszufinden, wie Globalize dies im Front-End tun könnte.

Weitere Informationen finden Sie unter https://www.timeanddate.com/time/gmt-utc-time.html und http://www.tutorialspoint.com/sqlite/sqlite_date_time.htm.

17 Weitere Schritte und Ideen

Speedtest muss nicht die Quelle Ihrer Rohdaten sein – sie können von überall her kommen und für alles sein, nicht nur für die Internetgeschwindigkeit. Das Prinzip ist dasselbe – ein Backend-Serverprozess, der die Rohdaten in einem nützlichen Format abrufen und sie dann aus einem Bash-Skript mit einem Frontend in SQLite importieren kann, das die gewünschte Teilmenge der Daten extrahiert und sie dann grafisch darstellt. P>

Ein komplexeres Bash-Skript könnte Daten direkt in eine SQL-Tabelle schreiben (mit dem SQL-Befehl INSERT), wenn die Formatierung als CSV keine Option ist. Denken Sie beim Entwerfen der SQL-Tabelle darüber nach, wie Sie die Daten später extrahieren möchten.

Berücksichtigen Sie bei Änderungen den Kontext des Codes, den Sie bearbeiten. Das heißt, wir haben SQL-Anweisungen in PHP-Skripten in Javascript in HTML. Erinnern Sie sich an das Niveau, auf dem Sie sich befinden, und codieren Sie entsprechend. Es kann leicht sein, den Überblick zu verlieren und am Ende PHP-Code in etwas zu schreiben, das Javascript sein sollte! Ich kann garantieren, dass dies nicht funktionieren wird.

Hier sind einige Ideen für weitere Erkundungen:

  • toLocaleString ist nicht einheitlich in allen Browsern implementiert. Verwenden Sie Globalize und verarbeiten Sie damit alle Zahlen-, Datums- und Zeitzonenformate.
  • Überprüfen Sie httpstat (es gibt eine Bash-Skriptversion), mit der verschiedene Arten von Internetverbindungsdaten gesammelt werden können. Speichern Sie dies in einer (separaten) SQL-Tabelle und stellen Sie die Ausgabe grafisch dar.
  • Verbesserung der Bandbreite.php-Oberfläche, um dem Benutzer die Wahl zwischen verschiedenen Optionen zu geben:24, 48, 72 Stunden; Wählen Sie ein bestimmtes Datum aus, schließen Sie Upload- und Download-Daten sowie Ping-Zeiten ein.
  • Konvertieren Sie den HTML-Code, um reaktionsschnellen Bootstrap-Code zu verwenden, damit er auf verschiedenen Geräten oder Bildschirmgrößen gut läuft.
  • Erkunden Sie einige der anderen Optionen von chart.js; vielleicht ein kombiniertes Linien- und Balkendiagramm; Ändern Sie die Farben und die Balkengröße.
  • SQLite durch MySQL ersetzen und mehr Sicherheit durch Lesezugriff von PHP über Benutzer/Passwort hinzufügen.
  • Erstellen Sie ein ähnliches System, verwenden Sie jedoch node.js.
  • Geschwindigkeitstest:https://github.com/sivel/speedtest-cli
  • SQLite3:https://sqlite.org/
  • chart.js:http://www.chartjs.org/
  • Globalisieren:https://github.com/globalizejs/globalize
  • httpstat:https://github.com/b4b4r07/httpstat
  • Bootstrap:http://getbootstrap.com/
  • PHP:http://www.php.net/
  • ISPConfig:http://www.ispconfig.org/
  • Debian:http://www.debian.org/

Linux
  1. So richten Sie einen FTP-Server in Ubuntu Linux ein und verwenden ihn

  2. Was ist ein Chown-Befehl unter Linux und wie wird er verwendet?

  3. So installieren und verwenden Sie Flatpak unter Linux

  4. So installieren und verwenden Sie Traceroute unter Linux

  5. So installieren und verwenden Sie das Mosh Command Line Tool Linux

So überprüfen Sie die Internetgeschwindigkeit unter Linux mit Speedtest CLI

So installieren und verwenden Sie phpMyAdmin unter Linux

So überprüfen Sie die Internetgeschwindigkeit unter Linux

So installieren und verwenden Sie den fd-Befehl unter Linux

So installieren und verwenden Sie Nu Shell unter Linux

So installieren und verwenden Sie den Xrdp-Server (Remote Desktop) auf einem Linux-System