👻

Windows10に標準搭載されたcurlコマンドを使ってWEBサイトの死活確認をする簡単なバッチファイル

2021/04/09に公開1

はじめに

Windows10にCURLコマンドが標準搭載されていたそうです。

◆下記のサイトを参考にさせていただきました
Windows 10 に curl がプリインストールされてた | もやもやプログラミング3

試しに死活確認のコードを作成して動かしてみました

LINUXではcurlコマンドを使ってWEBサイトの死活監視を実装することがありました。といってもSNMPや閾値などの実装ではなくWEBサーバから返ってくるステータスコードが正常:200を確認する程度のモノでした。
そこでWindowsクライアントからCURLでWEBサイトが生きているか確認するWindowsのバッチファイルをサンプルとして書いてみました。WindowsからWEBサイトの死活確認に使えるかもしれません。

まずはWindows10のcurlコマンドの動きを確認します。

> curl --version
curl 7.55.1 (Windows) libcurl/7.55.1 WinSSL
Release-Date: 2017-11-14, security patched: 2019-11-05
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL

2021年4月時点の状態です。バージョンを見てみると2017年に実装されてたんですね。

curlコマンド例

> curl -s -I -o nul -w "%{http_code}" https://www.google.co.jp
正常:200
エラー:200以外

-s 進捗状況など余計な出力を非表示にする
-o ファイル吐き出し先の指定(Linuxの/dev/nullの代わりにWindowsはnilを使います。)
-I ヘッダ情報(ステータスラインとレスポンスヘッダ)が出力される。
-w "%{http_code}" ステータスコードのみ取得する

簡単な使い方

下記のコードを「website_monitoring_status_code.bat」のようにバッチファイルとして保存をしてダブルクリック(もしくはコマンドライン)から実行すると指定されたURLから戻ってくるステータスコード確認するだけのシンプルな作りです。
check_urls[] を変更するとループで回してますので複数URLを確認可能にしています。

@echo off
setlocal enabledelayedexpansion

echo Website monitoring.
echo ----

set check_urls[0]=https://example1.co.jp
set check_urls[1]=https://example2.co.jp
set check_urls[2]=https://example3.co.jp
set check_urls[3]=https://example4.co.jp

set k=0
:LOOP
  call set check_url=%%check_urls[%k%]%%
  if defined check_url (
    set http_code=
    FOR /F %%i in ('curl.exe -s -k -I -L -o nul -w "%%{http_code}" %check_url%') DO SET http_code=%%i
    echo %check_url%
    if !http_code! neq 200 (
      echo -^> !http_code! NG
    ) else (
      echo -^> !http_code! OK
    )
    set /a k=%k%+1
    goto LOOP
  )
:LOOP_END

echo ----

pause

ちょっとハマったところ

バッチファイル内での外部コマンドの実行について、一度ファイルに書き出して読み込み直しをするというのも手なのですが、そうすると一時ファイルを作らないといけなくなります。一次ファイルは作りたくなったのでforを使った方法を採用してみたのですが、変数の値が上手く変更されない状態となりました。バッチファイルはforやカッコなどでくくられた処理は1行として認識するため変数の変更が反映されないそうです。
回避策として遅延変数(変数を%%でくくるのではなく!!でくくる)を使うことで実行したコマンド結果を正しく取得できるようになしました。「setlocal enabledelayedexpansion」は遅延変数を使えるようにするために足しています。

最後に

今時であれば「Microsoft automate desktop」などのRPAツール「Selenium」などの自動化ツールもあるため選択肢は多いのですが、curlはBasic認証に対応していたりPOSTも送れたりするのでサイトの死活確認をバッチファイルにしておいて手動実行する程度のモノであれば難しいRPAツールと比較するとすぐに使えそうです。

GitHubで編集を提案

Discussion

otnotn

-I を付けないと標準出力は1行なので、遅延環境変数展開は不要です。まあ、使用をあえて避けなくても良いのですが。

:LOOP
  call set check_url=%%check_urls[%k%]%%
  if defined check_url (
    set http_code=
    FOR /F %%i in ('curl.exe -s -k -L -o nul -w "%%{http_code}" %check_url%') DO (
      echo %check_url%
      if %%i neq 200 (
        echo -^> %%i NG
      ) else (
        echo -^> %%i OK
      )
    )
    set /a k=k+1
    rem または set /a k+=1
    goto LOOP
  )
:LOOP_END

また、
call set check_url=%%check_urls[%k%]%%
は、遅延環境変数展開を使わないで添え字的なことをする手段なので、使うなら、
set check_url=!check_urls[%k%]!
が簡明です。
そもそも、

FOR %%u IN (
https://example1.co.jp
https://example2.co.jp
https://example3.co.jp
https://example4.co.jp
) DO FOR /F %%i IN ('curl.exe -s -k -L -o nul -w "%%{http_code}" %%u') DO (

で良い気がします。