W Internecie dostępnych jest wiele serwisów, które testują prędkość naszego łącza. Jedne pokazuję wyniki w formie obrazków, sygnatur, posiadają ciekawą formę graficzną, kuszą wyglądem. Na wyniki takich testerów trzeba patrzeć z przymrużeniem oka. W tym artykule postaramy się napisać prosty tester prędkości łącza. Będzie on testował jak szybko jesteśmy w stanie pobierać plik z Internetu. Również i nasz skrypt nie będzie doskonały.
Przecież nam chodzi o poznanie Basha, a nie pisanie idealnej aplikacji do testowania prędkości łącz internetowych. W skrypcie wykorzystamy bardzo potężne i proste narzędzie jakim jest GNU Wget.
GNU Wget pozwala na pobieranie plików przy wykorzystaniu takich protokołów jak HTTP, HTTPS oraz FTP najpowszechniej używanych protokołów internetowych. Jego cechą wyróżniającą jest stosunek możliwości do niewielkich rozmiarów. Wget zaliczany jest do kategorii narzędziowych programów sieciowych i rozpowszechniany jest na licencji typu Open Source.
Wget może przedstawić się jako przeglądarka (opcja -U
, np. wget -U "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.0.1) Gecko/20021003"
). Przykładowe użycie wgeta obrazuje poniższy log:
paszczak000@hell:~/skrypty/bash$ wget http://temp.thecamels.org/test.img --09:01:38-- http://temp.thecamels.org/test.img => `test.img' Translacja temp.thecamels.org... 78.47.147.217 Łączenie się z temp.thecamels.org|78.47.147.217|:80... połączono. Żądanie HTTP wysłano, oczekiwanie na odpowiedź... 200 OK Długość: 10,485,760 (10M) [application/x-img] 100%[=================================================================================================================================================>] 10,485,760 1.81M/s ETA 00:00 09:01:44 (1.77 MB/s) - `test.img' saved [10485760/10485760]
Proces pobierania można wygodnie obserwować na ekranie dzięki wypisywanym znakom ===>
, z których każdy znak =
reprezentuje ustaloną ilość otrzymanych danych (domyślnie 1KB).
Jeżeli już znamy program, który będzie pobierał pliki z Internetu – czas na wykorzystanie jego możliwości. Wykorzystamy do tego polecenia wget
, awk
. Pierwsze z nich zajmie się pobieraniem pliku z ustalonego przez nas serwera, a drugie będzie odpowiedzialne za wyświetlenie wyników na ekranie. Dla zwiększenia wiarygodności wyników, zrobimy prostą pętlę, która powtórzy test kilka razy. Skrypt wygląda następująco:
if [ "$1" != "" ]; then stop=$1 for (( i=1; i<=stop; i++ )); do wget -O /dev/null http://temp.thecamels.org/test.img 2>&1 | awk '/saved/ { gsub(/.*\(|\).*/, ""); print; }'; done else echo "Podaj ilosc prob np: ./speed_tester.sh 10"; fi
Zaczniemy od pobrania jakiegoś pliku testowego. Następnie uruchamiamy polecenie wget
z parametrem -O
. Parametr ten skieruje nam pobrany plik do czarnej dziury (/dev/null
). Dzięki temu nie będziemy śmiecić sobie systemu jakimiś plikami. Następnie skorzystamy ze standardowych strumieni. Za pomocą symbolu 2>&1
przekierowujemy standardowy strumień błędów (STDERR
) do standardowego wyjścia (STDOUT
). Wynikiem działania skryptu będzie:
./speed_tester.sh 10 1.74 MB/s 1.73 MB/s 1.48 MB/s 1.73 MB/s 1.75 MB/s 1.50 MB/s 1.74 MB/s 1.73 MB/s 1.75 MB/s 1.73 MB/s
Następnie za pomocą awk wycinamy interesującą nas wartość, czyli prędkość pobierania pliku. Wynik ten drukujemy na ekranie i kończymy wykonywać skrypt. Modyfikując powyższy skrypt możemy napisać sobie proste narzędzie, które będzie nam monitorowało strony Internetowe, którego wynikiem będzie takie oto zestawienie:
Web page Date WWW Size Transfer TheCamels 08:43 OK 8 3.57 MB/s Empik 08:43 OK 36 278.96 KB/s Orange 08:43 OK 20 842.21 KB/s ICS 08:43 ERROR 0 0.00 KB/s WP 08:43 OK 8 306.01 KB/s Onet 08:43 OK 20 935.31 KB/s
I to by było na tyle. Oczywiście do wyników zwracanych przez skrypt należy podchodzić z przymrużeniem oka. Prędkość ta zależy przecież od wielu czynników jak np. możliwości serwera, z którego pobieramy plik, priorytety itp.
Świetny artykuł. Jak by się tak przyjrzeć tym, co już napisałeś związanych z bashem, to jest bardzo duże pole do nauki, jak również do sprawdzenia swoich własnych umiejętności w programowaniu i posługiwaniu się językami bash i awk. Może warto by zrobić nawet poradnik w formie pdfa :)