В наших блогах по Linux мы в основном говорим об отдельных командах и о том, как их использовать. Одной из самых мощных возможностей Linux является возможность автоматизации задач с помощью написания программ или сценариев.
Один из самых простых (и легко доступных) способов начать работу с кодированием в Linux – использовать Bash-скрипт. Bash – это язык оболочки, который интерпретирует команды между интерфейсом командной строки и операционной системой. Если вы используете один из самых популярных дистрибутивов Linux (Ubuntu, Debian, Fedora), то, скорее всего, вы раньше использовали Bash. Вы также можете найти его на MacOs и на Windows 10.
Также лучшие советы по настройке Linux/UNIX можно почитать в интернете, информации достаточно.
Мы не собираемся перечислять все циклические или условные операторы, доступные в Bash; Вы можете найти их в Интернете. Вместо этого мы дадим вам краткий шаблон скрипта, который делает что-то, имеющее отношение к сетевой инженерии: скрипт, который периодически запускает тест скорости (скорость загрузки и выгрузки) и сохраняет результаты в файле журнала.
Постановка задачи
Допустим, вы хотите измерять пропускную способность загрузки и выгрузки сети один раз в час и сохранять результаты в файле журнала для анализа. Вы можете получить эти измерения на любом устройстве, зайдя на speedtest.net и выполнив тест. Очевидно, невозможно, чтобы кто-то делал это раз в час и регистрировал результаты для вас.
Для решения этой проблемы нам понадобятся три вещи:
- Запустите этот тест пропускной способности в командной строке
- Автоматизируйте это через скрипт
- Записать результаты в файл
Команда Speedtest
Есть несколько способов измерить скорость загрузки и выгрузки. Один из самых простых и простых способов – использовать команду «speedtest-cli», которая является версией командной строки службы Ookla speedtest.net для командной строки. Для установки команды введите:
apt-get install speedtest-cli
Вывод:
~# apt-get install speedtest-cli Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed: speedtest-cli 0 upgraded, 1 newly installed, 0 to remove and 146 not upgraded. Need to get 13.1 kB of archives. After this operation, 64.5 kB of additional disk space will be used. Get:1 http://mirror.yandex.ru/ubuntu xenial/universe amd64 speedtest-cli all 0.3.4-1 [13.1 kB] Fetched 13.1 kB in 0s (301 kB/s) Selecting previously unselected package speedtest-cli. (Reading database ... 78919 files and directories currently installed.) Preparing to unpack .../speedtest-cli_0.3.4-1_all.deb ... Unpacking speedtest-cli (0.3.4-1) ... Setting up speedtest-cli (0.3.4-1) ...
Вот как выглядит результат команды speedtest:
speedtest-cli Retrieving speedtest.net configuration... Retrieving speedtest.net server list... Testing from JSC Server (213.159.210.167)... Selecting best server based on latency... Hosted by MGTS (Moscow) [1.61 km]: 2.856 ms Testing download speed........................................ Download: 91.34 Mbit/s Testing upload speed.................................................. Upload: 232.51 Mbit/s
Он обнаружил интернет-провайдера (JSC Server) и публичный IP (213.159.xxx.xxx). Затем он обнаружил сервер рядом с MGTS с задержкой 2,856 мс и 1,61 км. А затем он измерил скорость загрузки и выгрузки.
Псевдокод
Прежде чем писать какой-либо код, давайте подумаем о логике нашего скрипта. Мы полагаем, что легко понять следующий псевдокод, который соответствует формулировке проблемы выше:
- Бесконечный цикл
- Запустить speedtest
- Результаты журнала в файле
- Ждать 1 час
- Конец цикла
Скрипт на Bash
Фактический скрипт выглядит так:
#!/bin/bash while true ; do echo "Speedtest запущен..." speedtest-cli --simple >> /home/pi/speedtest.log echo "Speedtest остановлен..." sleep 3600 done
Давайте разберемся с ним:
Строка 1: это называется шебанг и сообщает операционной системе, какая оболочка используется для команд в сценарии. В данном случае это Bash.
Строка 3: «while» – это конструкция, которая может образовывать циклы. Выполняется ли цикл или нет, зависит от условия после «while». В этом случае мы жестко закодировали это условие в «true», поэтому цикл будет выполняться вечно. В качестве примера другого условия while “while [ “$SECONDS” -lt 3 ];” создает цикл, который запускается до 3 секунд с момента запуска скрипта (в Bash «$ SECONDS» дает истекшие секунды с момента запуска скрипт).
Строка 4: с помощью ключевого слова do мы указываем начало кода, который будет включен в цикл while. Вместе со словом «done» в строке 9 они указывают начало и конец команд, включенных в цикл.
Строка 5: Этот оператор выводит на экран сообщение «Speedtest запущен…». Это сообщение и сообщение «echo “Speedtest остановлен…”» в строке 7 помогают нам узнать, когда Speedtest начинается и заканчивается.
Строка 6: выполняет команду speedtest. Опция «–simple» не показывает подробный вывод, показывать только основную информацию. Таким образом, мы можем скопировать и вставить результаты в электронную таблицу для дальнейшей обработки или построения графиков. Поскольку мы хотим сохранить результаты в файле, мы используем команду добавления «>>», чтобы сохранить результаты в файле «/home/pi/speedtest.log».
Строка 7: она сообщает нам, что speedtest завершен
Строка 8: он спит в течение 3600 секунд, другими словами, он ждет час перед повторным выполнением цикла
Строка 9: определяет конец цикла команд
Запуск сценария
Мы сохранили скрипт в файле speedtest.sh (расширение «.sh» часто используется для файлов скриптов Bash).
Для запуска скрипта у вас есть два варианта:
- Введите «bash speedtest.sh»
- Сделайте скрипт исполняемым файлом и затем запустите его с помощью следующих команд
- chmod + x speetest.sh &
- ./speedtest.sh &
Чтобы скрипт продолжал работать после выхода из системы, необходимо запустить его в фоновом режиме с амперсандом «&» в конце. Если вы не используете амперсанд, сценарий остановится, как только вы выйдете из сеанса командной строки.
Результаты
Вот как выглядят сохраненные результаты в файле «/home/pi/speedtest.log»:
Ping: 2.369 ms Download: 83.55 Mbit/s Upload: 222.80 Mbit/s Ping: 2.154 ms Download: 84.23 Mbit/s Upload: 223.34 Mbit/s
Давайте объясним каждую строку:
Поле 1 (2.154): задержка
Поле 2 (83.55 Mbit/s): скорость загрузки в мегабит/с
Поле 3 (222.80 Mbit/s): скорость выгрузки в мегабит/с
Мы надеемся, что вы найдете этот скрипт полезным и достаточно простым, чтобы попробовать его на своем одном Linux-компьютере. Если у вас есть Raspberry Pi, вы можете заставить его работать, делая что-то полезное. И когда ваш провайдер не предоставляет пропускную способность, за которую вы платите, у вас будут свои инструменты.