GNU/Linux >> Znalost Linux >  >> Linux

Jak používat speedtest na serveru Linux ke kontrole, ukládání a vykazování rychlosti internetu graficky

V návaznosti na řadu problémů se špatným širokopásmovým připojením, se kterými jsem se potýkal, jsem se rozhodl, že chci pravidelně sledovat rychlost Mbps, kterou dostávám od svého poskytovatele. Zvláště špatné hodnoty jsem viděl při pokusu o stahování souborů večer, přičemž mnohem vyšší rychlosti bylo dosaženo velmi brzy ráno.

V rohu mám linuxový server Debian, což je můj testovací a vývojový stroj pro weby hostované ISPConfig, a také nějaký kód Let's Encrypt, se kterým si rád hraju, takže jsem hledal nějaký software, který by umožnil testování šířky pásma, spustitelný z linuxového příkazového řádku, což by mohlo tvořit základ automatizovaného systému shellových skriptů pro vytváření nezpracovaných dat, která jsem potřeboval. Chtěl jsem uložit data do SQL databáze, aby bylo dotazování jednoduché (mohl jsem pak snadno shromáždit více dat a jen extrahovat menší podmnožinu pro časová období, která mě zajímala) a mít webový front-end, který by mohl vytvářet jednoduchý graf. k vizualizaci dat a pomoci upozornit na problémy s konektivitou.

Prvním výsledkem mého hledání byl opravdu užitečný článek Antonia Valencie na adrese:https://www.howtoforge.com/tutorial/check-internet-speed-with-speedtest-cli-on-ubuntu/

Poté, co jsem se řídil tam uvedenými pokyny k instalaci speedtestu, rychlé hraní ukázalo, že jej mohu použít ke spuštění testů na široké sadě internetových serverů a také k vytvoření výstupu ve formátu CSV, který je docela vhodný pro import přímo do tabulky SQL pomocí minimální množství úsilí při vývoji softwaru.

Pro relativně malé množství dat, která by byla vygenerována, jsem se rozhodl použít SQLite jako back-end obchod a rychlé prohledání dostupných open-source knihoven založených na javascriptu mě přivedlo k chart.js, který má jednoduchý a čistý design. s jednoduchým datovým rozhraním, ale v případě potřeby se spoustou možností vyladit pokročilé možnosti. Převod dat SQL za účelem extrahování pouze podmnožiny dat, která jsem chtěl vykreslit pomocí výstupu přes JSON pomocí nějakého přímočarého kódu PHP, byl způsob, jak jít.

Celkově jsem tedy potřeboval navrhnout systém, který by vypadal takto:

Linuxový server, na kterém běží speedtest jako cronjob – možná 1 za hodinu – s výstupem speedtestu uloženým v databázi SQLite – vše řízeno souborem skriptu bash shell. Webový front-end, který je směsí HTML, CSS, javascriptu a PHP pro extrakci dat z SQLite a vytvoření sloupcového grafu znázorňujícího dosažené hodnoty Mbps za předchozích 24 hodin (nebo jakékoli jiné období, pro které bych se mohl rozhodnout).

Malé experimentování se spouštěním speedtestu několikrát interaktivně mi ukázalo, že je k dispozici několik serverů, které podle všeho dávají výsledky, které jsou těsně v souladu s rychlostí, kterou jsem zažíval. Považoval jsem za dobrý nápad testovat na více než jednom serveru, abych lépe porozuměl tomu, jak byly moje hodnoty Mb/s ovlivněny umístěním cílového serveru a denní dobou v jiném časovém pásmu.

Pokud chcete následovat a nastavit si podobný systém pro sebe, budete si muset vybrat jeden nebo více serverů ze stovek dostupných pro speedtest, které budou vyhovovat vaší lokalitě.

1 Předpoklady

  • linuxový server – používám Debian 9.1 – roztáhnout
  • tty přístup k serveru pomocí root přihlášení – používám PuTTY z notebooku se systémem Windows
  • Nainstalován ISPConfig a také webová stránka nakonfigurovaná s účtem FTP – používám verzi 3.1.6 s nastaveným webovým serverem apache (mohli byste spravovat pouze webový server, s několika drobnými změnami v následujících pokynech)
  • PHP – Používám 7.0, ale mělo by to fungovat i s většinou předchozích verzí
  • FTP klient – ​​používám Filezilla – a PureFTPd běžící na serveru
  • nano – nebo váš oblíbený vizuální editor

Předpokládám, že jste spokojeni s přihlášením na linuxový server, s tím, jak se pohybovat v adresářích, s rozložením místa, kde váš webový server očekává soubory, a jak do těchto adresářů přenášet soubory FTP.

Zde jsou podrobné kroky, které vám umožní toto vše nastavit.

2 Instalovat speedtest

Přihlaste se ke svému linuxovému serveru jako root a spusťte příkaz:

# pip install speedtest-cli

Viz https://www.howtoforge.com/tutorial/check-internet-speed-with-speedtest-cli-on-ubuntu/ a https://pypi.python.org/pypi/speedtest-cli pro další informace, pokud máte nějaké problémy.

Poznámka:speedtest a speedtest-cli jsou v mé instalaci identické, takže v následujícím budu odkazovat pouze na speedtest.

3 Nainstalovat SQLite3

# apt-get install sqlite3

Použijte ekvivalent pro vaši distribuci, pokud apt-get není pro vás.

4 Vytvořit bandwidth.sh

Zadejte následující kód bash skriptu do souboru a uložte jej jako /usr/local/etc/bandwidth.sh – upravíme jej o něco později, aby byl pro vás specifický.

#!/bin/bash# spusťte rychlostní testy proti 3 serverům a uložte všechny výstupní výsledky do souboru CSV pro import do sqlite db## spouštěné cronjob jednou za hodinu##funkce getCSVString () { # pokud rychlostní test selhal (např. nelze získat přístup k serveru) musíme vytvořit fiktivní nulovou položku pro tento časový úsek # získat řetězec časového razítka ve stejném formátu, který generuje speedtest - a potřebujeme místní čas UTC RIGHTNOW=$(date --utc +%Y- %m-%dT%H:%M:%SZ) # na kterém serveru testujeme? if [ $1 ="5443" ] pak echo "5443,Fasthosts Internet,Gloucester,$RIGHTNOW,73.09,0.0,0.0,0.0" fi if [ $1 ="1234" ] pak echo "1234,Uno,Milton Keynes,$RIGHTNOW ,168.27,0.0,0.0,0.0" fi if [ $1 ="1783" ] pak 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}funkce runTest () { # spustit test rychlosti proti pojmenovanému serveru s výstupem csv uloženým v souboru tmp /usr/local/bin/speedtest --csv --server $1> /usr/local/etc/speedtest.tmp pokud [ $? -gt 0 ] potom # speedtest se nezdařil, takže místo jakékoli chybové zprávy vytvořte nulovou položku getCSVString $1> /usr/local/etc/speedtest.tmp fi # uložit výstup připraven pro další test serveru cat /usr/local/etc/speedtest .tmp>
> /usr/local/etc/speedtest.csv}# main######## spustit speedtest proti 3 serverům a uložit všechny výstupní výsledky do csv filecd /usr/local/etc# vymazat soubor csv - potřeby být prázdný na začátku runrm -f /usr/local/etc/speedtest.csv############################## ############## případ testu/ladění – vynutí selhání testu speedtest########################## ################## spustitTest "199999999"# spánek 5####### komentář po testování ############## ########################################runTest "5443"spánek 10runTest "1234"spánek 10runTest "1783"sleep 1# nyní importujte data csv do sqlite dbsqlite3 -batch /usr/local/etc/bandwidth.db <<"EOF".separator ",".import /usr/local/etc/speedtest.csv bandwidthEOF# přidat aktuální běh csv do backupcat /usr/local/etc/speedtest.csv>> /usr/local/etc/speedtest.bak

Omlouvám se za svůj přístup „pás a rovnátka“, kdy všude používám úplné cesty pro soubory, i když to není potřeba. Je to přesně tak, jak to rád dělám. Pokud jste spokojeni s úpravou bash skriptů, můžete to zlepšit.

Nastavte vlastnosti souboru, aby byl tento skript spustitelný:

# chmod 0700 bandwidth.sh

5 Vytvoření databáze SQLite

Vytvořte bandwidth.db SQLite databázi v /usr/local/etc :

#sqlite3 bandwidth.db

a poté na výzvu sqlite> vytvořte novou tabulku pomocí následujícího příkazu (nenechte si ujít poslední středník):

sqlite> VYTVOŘIT TABULKU, POKUD NEEXISTUJE "šířka pásma" ("serverid" INTEGER NOT NULL , "sponzor" VARCHAR NOT NULL , "servername" VARCHAR NOT NULL , "times" DATETIME PRIMARY KEY NOT NULL UNIQUE , "ATDistance" FLO NULL , "ping" FLOAT NOT NULL , "download" FLOAT NOT NULL , "upload" FLOAT NOT NULL );
sqlite> .quit

Tím se vytvoří tabulka nazvaná šířka pásma s poli, která se mapují přímo na výstup formátu CSV z speedtestu.

6 Získat seznam serverů

Budete potřebovat seznam serverů, které speedtest používá.

# speedtest --list> servers.txt

Nyní zkontrolujte v souboru servers.txt číselná ID serverů, na kterých chcete spustit testy.

# nano servers.txt

Soubor bude vypadat podobně jako tento:

Načítání konfigurace speedtest.net... 5833) Hub Network Services Ltd (Newport, Wales) [57,50 km] 5938) Spectrum Internet (Cardiff, Velká Británie) [65,89 km] 5443) Fasthosts Internet (Gloucester, Velká Británie) [74,31 km] 6504) Secure Web Services Ltd (Shrewsbury, Velká Británie) [78,64 km] 7265) Unitron Systems &Development Ltd (Telford, Velká Británie) [87,11 km] 8225) Exascale Limited (Wolverhampton, Velká Británie) [96,08 km ] 3110) zero.net.uk Ltd (Studley, Velká Británie) [96,12 km]12401) Dragon WiFi LTD (Haverfordwest, Spojené království) [120,78 km] 1153) Warwicknet Ltd. (Coventry, Velká Británie) [125,18 km] 1685 ) Vodafone UK (Newbury, Velká Británie) [153,25 km] 4384) Iomart (Leicester, Velká Británie) [157,40 km] 1234) Uno (Milton Keynes, Velká Británie) [170,71 km] 3504) TNP Ltd. (Manchester, Velká Británie ) [170,93 km]11747) Vispa (Manchester, Spojené království) [170,93 km]

ID serverů jsou na levé straně. Číslo na konci každého řádku je odhad, který speedtest udělal ze vzdálenosti v kilometrech mezi vaší polohou a polohou serveru, i když si nejsem jistý, zda je příliš přesný a může se měnit od běhu k běhu. Testovací servery budou uvedeny v pořadí podle této vzdálenosti počínaje nejbližší. Testování se servery v horní části tohoto seznamu by vám teoreticky mělo poskytnout nejrychlejší ping a nejlepší rychlost stahování a odesílání ve srovnání se servery níže v seznamu, které jsou mnohem dále.

7 Vyberte ID serverů a upravte bandwidth.sh

Nyní by byl čas spustit speedtest ručně proti výběru různých dostupných ID serveru a zjistit, jaké výsledky získáte. Pro srovnání jsem si vybral několik serverů blízko mě ve Velké Británii a jeden v Kalifornii. Formát příkazu, který se má použít, je:

# speedtest --server 1234

Výstup, který uvidíte, bude podobný:

Načítání konfigurace speedtest.net...Testování z xxxxxxx (n.n.n.n)...Načítání seznamu serverů speedtest.net...Výběr nejlepšího serveru na základě pingu...Hostováno Uno (Milton Keynes) [187,87 km]:Rychlost stahování 33,243 msTesting ................................................ ...................................Stahování:1,60 Mbit/sTestovací rychlost odesílání....... ................................................................... ......................................Nahrávání:0,55 Mbit/s

Jakmile vyberete servery, které chcete použít, vložte číselná ID serverů (použil jsem 3 servery, ale můžete to změnit, pokud chcete) do příslušných řádků v bandwidth.sh

runTest "5443"spánek 10runTest "1234"spánek 10runTest "1783"spánek 1

Budete také muset upravit kód v chybové rutině, která vytvoří fiktivní záznam, pokud by speedtest selhal v některém konkrétním běhu.

 # na jakém serveru testujeme? if [ $1 ="5443" ] pak echo "5443,Fasthosts Internet,Gloucester,$RIGHTNOW,73.09,0.0,0.0,0.0" fi if [ $1 ="1234" ] pak echo "1234,Uno,Milton Keynes,$RIGHTNOW ,168.27,0.0,0.0,0.0" fi if [ $1 ="1783" ] pak echo "1783,Comcast,\"San Francisco, CA\",$RIGHTNOW,8420.0,0.0,0.0,0.0" fi

Čísla za $RIGHTNOW tam (např. 73,09) jsou vzdálenosti v kilometrech od vašeho umístění k příslušnému serveru. Nikde je nepoužívám, takže jsou pouze zástupným symbolem a mohou být libovolnou číselnou hodnotou.

Všimněte si v tomto příkladu 1783, že musíme umístit uvozovky na umístění a escapovat je, abychom je dostali do souboru CSV, který vytváříme. Uvozovky jsou zde povinné, protože toto místo má náhodou v sobě čárku. Bez uvozovek by byla čárka považována za oddělovač pole CSV, což by způsobilo problém s importem SQLite. Pokud má vybraný server podobný text umístění s čárkou, budete muset použít uvozovky.

8 Nastavit cronjob

Nastavte cronjob tak, aby se spouštěl jednou za hodinu (nebo tak často, jak chcete v rozumných mezích) pro spuštění /usr/local/etc/bandwidth.sh. Pokud používáte ISPConfig, můžete jej použít k naplánování cronjob.

Případně na příkazovém řádku linuxu můžete zadat:

# crontab -e

Měli byste vidět něco podobného tomuto (nezapomeňte, že jste přihlášeni jako 'root'):

* * * * * /usr/local/ispconfig/server/server.sh 2>&1 | při čtení řádku; do echo `/bin/date` "$line">> /var/log/ispconfig/cron.log; hotovo* * * * * /usr/local/ispconfig/server/cron.sh 2>&1 | při čtení řádku; do echo `/bin/date` "$line">> /var/log/ispconfig/cron.log; hotovo1 * * * * /usr/local/etc/bandwidth.sh 2>&1

Pokud nepoužíváte ISPConfig, může být zpočátku prázdný. Přidejte poslední řádek přesně tak, jak je uvedeno výše – mezery jsou důležité – pro spuštění skriptu shellu počínaje 00:01 a poté opakování každou hodinu, každý den. Samozřejmě si můžete vybrat různé časy. (Při prvním spuštění se vás crontab zeptá, který editor chcete použít – já volím nano.)

9 Nastavit PHP open_basedir

Přidejte /usr/local/etc do položky PHP open_basedir pro web. V ISPConfig to najdete na kartě Možnosti pro web.

To umožňuje kódu bandwidth.php přistupovat k databázi SQLite, kterou jsme právě vytvořili, v tomto adresáři.

Mohli bychom to přeskočit, kdybychom se rozhodli vytvořit databázi v adresáři, který je již nastaven jako přístupný, jako je /var/www/clients/client1/web1/web/, ale to by byla špatná volba z hlediska zabezpečení .

10 Vytvořit bandwidth.php

Tento kód musíte zkopírovat do souboru s názvem bandwidth.php na vašem serveru v základním adresáři webových dokumentů. Pokud používáte ISPConfig, bude to něco jako /var/www/clients/client1/web1/web/

   Monitor šířky pásma – rychlost stahování za posledních 24 hodin

Rychlost stahování – posledních 24 hodin

Upravte tento soubor tak, aby používal serverid, o kterém chcete vytvořit přehled. Ve svém příkladu zde používám server 1234, protože jsem zjistil, že po několika dnech prozkoumání dat tento server produkoval čísla Mb/s, která nejvíce odpovídala rychlosti, kterou jsem cítil. Serverid je v klauzuli WHERE příkazu SQL SELECT:

SELECT serverid, strftime("%H:%M", krát) || " " || strftime("%d/%m/%Y", časy) AS časové razítko, sponzor, název serveru, 
stahování
Z šířky pásma
KDE serverid =1234
ORDER BY krát
LIMIT 24 OFFSET (SELECT COUNT(*)/3 FROM bandwidth)-24;

Co přesně tento příkaz SQL dělá? Pokud nejste obeznámeni s SQL, pak se podívejme na každou část.

A. SELECT je příkaz pro čtení záznamů z databázové tabulky SQL a po něm následují pole ke čtení a další možnosti.

b. strftime("%H:%M", časy) || " " || strftime("%d/%m/%Y", krát) AS časové razítko

je přeformátovat řetězec datetime, který speedtest vytvořil ve svém výstupu CSV, na něco trochu uživatelsky přívětivějšího. Chci data ve formátu pro Spojené království, takže to vezme řetězec jako „2017-08-31T12:02:51.898186Z“ a změní ho na „12:02 31/08/2017“. Je jednodušší provést toto přeformátování přímo v příkazu SQL, než jej následně zpracovávat. Časy zde budou UTC/GMT, což je pro mě v pořádku, ale možná to budete chtít změnit; např. pokud chcete data ve formátu USA, změňte druhou část na strftime("%m/%d/%Y", krát).

C. serverid, timestamp, sponzor, servername, download jsou pole, která chceme načíst z tabulky SQL a vytvořit v našem objektu JSON.

d. FROM bandwidth je název tabulky SQL, ze které čteme.

E. WHERE serverid =1234 nastavuje podmnožinu tabulky ke čtení – změňte toto nastavení tak, aby odpovídalo použitému serveru id, a možná budete chtít číst data pro více než jeden server – ale to zkomplikuje graf.

F. ORDER BY times nastavuje pořadí řazení výstupu – chceme, aby byl seřazen podle časového razítka, které speedtest nastavil pro každý běh.

G. LIMIT 24 omezuje výstup na 24 záznamů, protože chceme zobrazovat pouze data za 24 hodin a protože náš cronjob je nastaven na spouštění jednou za hodinu. Pokud byste běhali dvakrát za hodinu, museli byste toto nastavit na 48, abyste získali 24 hodin dat.

h. OFFSET (SELECT COUNT(*)/3 FROM bandwidth)-24; chceme posledních 24 záznamů z tabulky, protože se jedná o nejnovější záznamy, které nás zajímají, takže musíme zadat OFFSET, aby odpovídal LIMITU. Bez toho bychom vždy dostávali prvních 24 záznamů v tabulce spíše než 24 nejnovějších. Abychom získali správný offset, spočítáme všechny záznamy v tabulce pomocí (SELECT COUNT(*)), pak to vydělíme 3 (protože spouštíme speedtest 3x za hodinu, jednou pro každý ze 3 různých serverů) a poté odečteme 24 z tohoto součtu získat správnou pozici OFFSET, takže LIMIT 24 pak získá záznamy, které chceme.

Pokud jste změnili bash skript tak, aby spouštěl něco jiného než 3 různé serverové testy za hodinu, upravte příslušnou část /3. Pokud testujete pouze proti jednomu serveru, pak rozdělení není vůbec potřeba.

Můžete také upravit celkovou velikost grafu, kde jsem zvolil snadnou cestu tvrdého kódování velikosti vhodné pro mou obrazovku – nastavuje se v tomto řádku:

11 Získejte místní kopii souborů

Dávám přednost místním verzím jakýchkoli souborů knihovny css a js (ale ne písem Google), které jsou potřeba na webové stránce, a pokud jste stejní, budete muset získat kopii na svém serveru Chart.bundle.min. js a umístěte jej do adresáře /var/www/clients/client1/web1/web/scripts na vašem serveru (nebo do libovolného základního adresáře, který je pro vás vhodný).

Soubor si můžete stáhnout z:https://cdnjs.cloudflare.com/ajax/libs/Chartajs/2.6.0/Chart.bundle.min.js

Pokud nechcete používat místní kopii, upravte soubor bandwidth.php tak, aby místo toho ukazoval na veřejnou verzi CDN. Stačí změnit tento řádek:

na toto:

12 Povolení PHP v ISPConfig

Nezapomeňte v nastavení webu povolit PHP, pokud již není nastaveno.

13 Načíst bandwidth.php v prohlížeči

Konečně jsme skončili. Jakmile měl skript shell bandwidth.sh čas se několikrát spustit, aby vygeneroval nějaká data (nebo jej můžete spustit několikrát ručně), nasměrujte svůj prohlížeč na webovou stránku svého linuxového serveru, načtěte bandwidth.php a měli byste vidět něco jako toto:

A ano, moje širokopásmové připojení je opravdu tak špatné!

Nakonec je zde několik dalších bodů, které stojí za to věnovat pozornost:

Výstup 14 sloupcových grafů

Měli bychom poznamenat, že údaje o stahování a nahrávání uložené v tabulce SQL jsou v bps spíše než v Mbps (spolu s matoucím počtem desetinných číslic - čísla jako 1533681.5922415722). To je právě způsob, jakým speedtest vytváří data při spuštění v režimu CSV. Pro zobrazení čísla Mb/s, nikoli b/s, je na výstupu osy y sloupcového grafu několik řádků zahrnutých v kódu Javascriptu v bandwidth.php pro provedení převodu:

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

Použití toLocaleString by mělo vložit správnou desetinnou radixovou interpunkci ("." nebo ","), jak je nastaveno v nastavení národního prostředí vašeho prohlížeče, ale to je závislé na implementaci a poněkud nekonzistentní. Pokud vidíte . místo , a to vás obtěžuje, pak Globalizace je způsob, jak to opravit. Viz '18 dalších kroků a nápadů' níže.

K přepsání výchozího zacházení s koncovými nulami je potřeba ještě několik řádků, protože chart.js normálně zobrazí „2 000“ jen jako „2“, což není to, co chci, zvláště když mám potíže s zajistit, aby tam byly především:

 // přepíšeme výchozí tooltip, který vynechá koncové nuly, i když jsme je tam již umístili tooltipy:{ callbacks:{ label:function(tooltipItem, data) { var value =data.datasets[0].data[ tooltipItem.index]; var label ='stáhnout:'; var retvalue =value.toLocaleString(undefined, { minimumFractionDigits:3 }); návratový štítek + ' ' + retvalue + ' Mbps'; } } },

Toto je pěkný příklad toho, jak můžete „prohloubit“ graf.js a změnit způsob, jakým to dělá.

Také jsem nastavil možnosti grafu pro tisk časového razítka na ose x pro každý pruh:

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

Výchozí možnost (s automatickým přeskočením nastaveným na hodnotu true) vedla k několika zvláštně vypadajícím mezerám v popiscích. Pokud chcete zobrazit něco jiného než 24 záznamů, budete muset změnit maxTicksLimit.

Pokud chcete další pomoc se změnou kterékoli z možností chart.js nebo nemůžete získat to, co chcete, podívejte se prosím na konkrétní stránky chart.js Stack Overflow – je tam spousta užitečných informací – https://stackoverflow .com/questions/tagged/chart.js – Stačí použít vyhledávací pole k zúžení toho, co hledáte. Bohužel v dokumentaci chart.js chybí některé pokročilejší příklady, které by jistě velmi pomohly zrychlit používání tohoto úžasného kusu open-source kódu.

15 Zpracování chyb

Během prvních testovacích běhů jsem si několikrát všiml, že speedtest v souboru CSV hlásil „Nelze načíst seznam serverů speedtest“. Pravděpodobně to odráželo časy, kdy bylo moje širokopásmové připojení tak špatné, že se speedtest vůbec nemohl připojit k testovacímu serveru. Tento text zjevně není ve formátu, který chceme importovat do databáze SQLite, takže jsem potřeboval řešení, které by tento nežádoucí text ze souboru CSV vypustilo a také obsahovalo nulový záznam v databázi pro konkrétní časový úsek, protože jinak by jakákoli chybějící položka v tabulce SQL byla jednoduše neviditelná a také by vyřadila zarovnání, které jsem chtěl mít při vytváření grafu 24 položek za den.

V bandwidth.sh uvidíte, že skript testuje výstupní kód nastavený speedtestem pomocí skriptové proměnné $? a pokud je větší než nula, znamená to, že test rychlosti selhal. To spustí funkci k vytvoření fiktivního záznamu CSV – který se pak použije k přepsání souboru CSV pro daný běh.

Ve skriptu bash je několik řádků, které jsou zakomentovány, ale které otestují tuto chybovou rutinu, aby vygenerovala fiktivní nulovou položku, pokud skript spustíte po zrušení komentáře těchto řádků.

############################################ test/ případ ladění – vynutí selhání testu speedtest########################################### ## runTest "199999999"# spánek 5####### komentář po testování ############################## ########################

Toto používá 'nesmyslné' ID serveru, které se speedtestu nelíbí, což způsobuje, že vrací nenulový výstupní kód. Skript by pak měl vytvořit fiktivní položku, která může šťastně sedět v tabulce SQL a být ignorována, nebo ji můžete smazat.

Dalším způsobem, jak vynutit selhání speedtestu pro tento testovací účel, by bylo odstranění síťového připojení serveru. Nezapomeňte, že skript bandwidth.sh můžete kdykoli spustit ručně, nemusíte čekat, až ho cronjob spustí, i když byste se měli vyhnout jeho ručnímu spouštění, pokud se blíží cronjob. Pokud by dva skripty běžely současně, pravděpodobně by došlo k poškození souborů CSV a následně tabulky SQL.

Pokud dojde k nejhoršímu, pak existuje záložní CSV soubor vedený jako /usr/local/etc/speedtest.bak, který by měl obsahovat veškerý CSV výstup z speedtestu od prvního spuštění bash skriptu dále. Toto lze upravit, aby se odstranily jakékoli nechtěné položky, vyčistila se tabulka SQL a poté se celá sada položek CSV znovu importovala do SQLite.

16 časových pásem

Speedtest hlásí čas v UTC (v podstatě je to stejné jako Greenwichský čas nebo GMT). Použití UTC znamená, že všechny časy uložené v tabulce SQL jsou konzistentní a letní čas nebude mít žádný nežádoucí dopad.

To však znamená, že rutina zpracování chyb v bandwidth.sh musí vytvořit časové razítko pro fiktivní záznam, aby to odráželo. To je docela jednoduché – právě jsme zahrnuli příznak --utc:

místní RIGHTNOW=$(datum --utc +%Y-%m-%dT%H:%M:%SZ)

Pokud chcete, aby popisky osy x grafu zobrazovaly časy jinak než UTC/GMT, pak by nejlepší místo pro provedení takové změny bylo v příkazu SQL SELECT, např.:

strftime("%H:%M", time(times, 'localtime')) || " " || strftime("%d/%m/%Y", krát) AS časové razítko

To by použilo nastavení časového pásma vašeho linuxového serveru k úpravě časů zobrazených v grafu. Nebo se můžete ponořit a zjistit, jak by to Globalize mohla udělat v front-endu.

Další informace naleznete na https://www.timeanddate.com/time/gmt-utc-time.html a http://www.tutorialspoint.com/sqlite/sqlite_date_time.htm.

17 dalších kroků a nápadů

Speedtest nemusí být zdrojem vašich nezpracovaných dat – mohou pocházet odkudkoli a být pro cokoli, nejen pro rychlost internetu. Princip je stejný – proces backendového serveru, který dokáže získat nezpracovaná data v užitečném formátu a poté je importovat do SQLite z bash skriptu s front-endem, který extrahuje podmnožinu dat, která chcete, a poté je zmapuje.

Složitější bash skript by mohl zapisovat data přímo do tabulky SQL (pomocí příkazu SQL INSERT), pokud formátování jako CSV není možné. Při navrhování tabulky SQL přemýšlejte o tom, jak budete chtít data extrahovat později.

Při provádění jakýchkoli změn mějte na paměti kontext kódu, který upravujete; tj. máme SQL příkazy uvnitř PHP skriptu uvnitř Javascriptu uvnitř HTML. Pamatujte si úroveň, na které se nacházíte, a podle toho kódujte. Může být snadné ztratit přehled a skončit psaním kódu PHP v tom, co by mělo být Javascript! Mohu zaručit, že to nebude fungovat.

Zde je několik nápadů pro další průzkum:

  • toLocaleString není konzistentně implementován ve všech prohlížečích. Použijte Globalizaci a zpracujte s ní všechny formáty čísel, data a časového pásma.
  • Checkout httpstat (existuje verze bash skriptu), která umožňuje shromažďovat různé typy dat o připojení k internetu. Uložte to do (samostatné) SQL tabulky a znázorněte výstup.
  • Vylepšete front-end bandwidth.php, aby měl uživatel na výběr z různých možností:24, 48, 72 hodin; vyberte konkrétní datum, zahrňte data pro nahrávání a stahování, časy pingu.
  • Převeďte HTML tak, aby používal responzivní kód Bootstrap, aby fungoval dobře na různých zařízeních nebo velikostech obrazovky.
  • Prozkoumejte některé další možnosti chart.js; možná kombinovaný spojnicový a sloupcový graf; změnit barvy a velikost pruhu.
  • nahraďte SQLite MySQL a přidejte více zabezpečení pomocí přístupu pro čtení z PHP prostřednictvím uživatele/hesla.
  • Sestavte podobný systém, ale použijte node.js.
  • speedtest:https://github.com/sivel/speedtest-cli
  • SQLite3:https://sqlite.org/
  • chart.js:http://www.chartjs.org/
  • Globalizovat: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. Co je příkaz Chown v Linuxu a jak jej používat

  2. Jak nainstalovat a používat Flatpak v Linuxu

  3. Jak nainstalovat a používat Traceroute v Linuxu

  1. Jak nastavit a používat FTP server v Ubuntu Linux

  2. Jak nainstalovat a používat telnet na Kali Linux

  3. Jak nainstalovat a používat nástroj příkazového řádku Mosh Linux

  1. Jak nainstalovat a používat Linux Screen?

  2. Linux Tail Command:Co to je a jak jej používat

  3. Jak nainstalovat a používat SSHFS na Linuxu