Speedtest CLIでインターネット速度を定期自動計測してログを残す方法


はじめに

ネットワークのスピードを計測する際に、Speedtest.netfast.comを使うとWebブラウザ上で気軽に測れますが、1時間に1回など自動で定期的に測って記録を残しておきたい場合があります。その方法を簡単にまとめます。

対応方針

今回は、次のように対応したいと思います。

  • コマンドラインで使えるSpeedtest CLIで、csvでログが出力されるようにバッチを作成
  • Windowsのタスクスケジューラで、上記を実行するバッチを定期実行できるようにする。

なお、Speedtest CLI自体はMacやlinux版もありますので、cronなどで定期実行できるようにすれば同様に対応は可能と思われます。

実際の対応

Speedtest CLIのダウンロードと、今回の使い方のポイント

  1. ダウンロード先はこちら→Speedtest CLIのサイト
  2. csvで出力するには、実行時に -f csvのオプションをつける
  3. ヘッダ情報を得るには、実行時に-f csv --output-headerのオプションをつける。ただし、計測ログは追記で対応したいので、事前に1回だけ実行しておいて、ヘッダファイルを作っておく。
  4. -s %id%オプションで、接続先のサーバを選ぶことができる。つけないと実行時に変わる可能性があるので、指定した方が良いかも。
  5. 上記の%id%のリストとその接続先情報は-Lオプションで閲覧可。事前に確認しておく。
  6. csvファイル出力にすると、実行時間が記録されないので、追記されるようにバッチ側で対応する。この時に、前に作成したヘッダも実行時間カラムを追記しておく。

以上を踏まえて、次のように作ってみました。
事前にヘッダ情報だけは、%current_dir%log_speedtest.csvに書いておく感じです。
※9/29追記:このバッチとspeettest.exeは同じフォルダにあるのを想定して書いています。exeファイルと分けて保存する場合は、5行目のinの中で指定しているexeファイルのパスを配置場所に置換してください。
※9/29再度追記:転記した関係で5行目にバグがありました。usebackq delimsのところが、usebackq delimと記載されてました。下記コードは修正済みです。大変失礼いたしました。

speedtest-cli.bat
@echo off
setlocal
set current_dir=%~dp0
set NOW_TIME="%date% %time%"
for /f "usebackq delims=" %%A in (`%current_dir%speedtest.exe -f csv -s 21569`) do set RSLT=%%A
set RSLT_DATA=%NOW_TIME%,%RSLT%
echo %RSLT_DATA% >> %current_dir%log_speedtest.csv

一応、バッチ単体で動くことを確認して、バッチ作成までは終わりとなります。

Windowsのタスクスケジューラの設定

簡単に設定できると思いきや、意外と罠がありました。
不要な設定もあるかもしれませんが、関連サイトを見ながら設定しました。
参考にしたサイトとポイントだけ記載します。

基本的なタスクの設定

Windowsでbatファイルを自動実行したい時(タスクスケジューラの設定)を参考にしました。
「[トリガー]の設定」と「[操作]タブにて実行させるスクリプトの設定」以外は同様に対応しました。

トリガーの設定

1日1回の計測だと不十分で、1時間に1回はやりたく、Windows10でタスクを1時間間隔で実行する方法を参考にしました。
ポイントとしては、詳細設定の繰り返し間隔終了時間を設定するところです。

タスク作成の全般の一番下の構成を変更

私はWindows10を使ったのですが、なぜかデフォルトでVistaになっているので、一応変更しておきました。

操作タブの開始(オプション)の設定

ここまでしても、タスクスケジュールのログ的には正常に実行されたと表示されますが、バッチは実行されず。。
困って、タスクスケジューラに登録したバッチがうまく実行できない時に確認することを調べて対処したところ、下記の設定が必要ということがわかりました。

例えば、この1行バッチのようにカレントディレクトリに依存するコマンドがある場合は、[操作]タブの設定で「開始(オプション)」という欄にどのディレクトリで実行したいか――すなわち作業フォルダを記述しないといけない。

「set current_dir=%~dp0」と書いたせいですかね。。
タスクスケジューラで使うバッチの場合は、絶対パス記載の方が良かったかも。

最後に

意外と、バッチで対処するところやタスクスケジューラで対応するところがありました。
特に、タスクスケジューラはタスクスケジューラ上では「正常に実行された」とログが残るが、実際はバッチが実行されないとログだけではわからないところもあり、設定に少し悩みました。(ググればすぐわかりましたが。。)
不要な設定もあるかもしれませんが、参考になれば幸いです。

実行環境

  • Window 10 Pro ver 20H2
  • Speedtest CLI windows版 1.0.0

参考文献