Skip to main content

How to Monitor Web Service Availability in Batch Script

Maintaining "High Availability" for web services is a requirement for any modern IT environment. Whether you are managing an internal dashboard, an API gateway, or a customer-facing website, you need to know the moment the service goes down. A "Self-Healing" or "Monitoring" script doesn't just check the site once; it runs in a continuous loop, logging the uptime and alerting the administrator if the service stops responding or returns a server error (500).

This guide will explain how to build a persistent web monitoring script using curl.

Method: The Continuous Health Check Loop

This script will check a URL every minute and log the results to a CSV file for long-term auditing.

@echo off
setlocal enabledelayedexpansion

set "URL=https://api.mycompany.com/health"
set "LogFile=service_uptime.csv"
set "CheckInterval=60"

:: 1. Initialize Log File with Headers
if not exist "%LogFile%" >"%LogFile%" echo Date,Time,Status,Code

echo [MONITOR] Watching %URL%...
echo [MONITOR] Logs saved to %LogFile%. Press Ctrl+C to stop.

:CheckLoop
:: Default to 000 in case curl is not installed or produces no output
set "code=000"

:: 2. Use CURL to get the HTTP Status Code
for /f %%a in ('curl -s -o nul -w "%%{http_code}" --connect-timeout 10 "%URL%" 2^>nul') do set "code=%%a"

:: 3. Determine Status based on the HTTP code range
if "!code!"=="000" (
set "status=OFFLINE"
) else if "!code:~0,1!"=="2" (
set "status=ONLINE"
) else if "!code:~0,1!"=="3" (
set "status=REDIRECT"
) else if "!code:~0,1!"=="4" (
set "status=CLIENT_ERROR"
) else if "!code:~0,1!"=="5" (
set "status=SERVER_ERROR"
) else (
set "status=UNKNOWN"
)

:: 4. Log to console and file
echo [%time%] !status! - HTTP !code!
>>"%LogFile%" echo %date%,%time%,!status!,!code!

:: 5. Alert if status is not ONLINE
if not "!status!"=="ONLINE" (
echo [ALERT] Service is not healthy! Status: !status!
)

timeout /t %CheckInterval% /nobreak >nul
goto :CheckLoop

Method 2: Detecting "Slow" Responses (Latency)

Sometimes a service is "Up" but it's so slow it's effectively "Down" for users. You can monitor the response time (latency).

@echo off
setlocal

:: Default to 0 in case curl is not installed or produces no output
set "latency=0"

:: Capture 'time_total' from CURL
for /f %%a in ('curl -s -o nul -w "%%{time_total}" "https://www.google.com" 2^>nul') do set "latency=%%a"

echo [PERF] Response Time: %latency% seconds

:: Batch cannot compare decimals natively, so use PowerShell
:: (curl always outputs '.' as the decimal separator regardless of locale)
powershell -Command "if (%latency% -gt 2.5) { exit 1 } else { exit 0 }"
if %errorlevel% neq 0 echo [WARN] Service is experiencing high latency!

endlocal

How to Avoid Common Errors

Wrong Way: Using "Ping" to check a Web Service

A server might "Ping" (ICMP response) but the web server (IIS/Apache/Nginx) might be crashed.

Correct Way: Use curl. It tests the actual application layer. A server can be "Pingable" but still return a 502 Bad Gateway error for the website.

Problem: SSL Certificate Errors

If your internal web service uses a self-signed certificate, curl will fail by default.

Solution: Use the -k (or --insecure) flag to tell curl to ignore certificate warnings for internal monitoring. curl -k -s ...

Best Practices and Rules

1. Connection Timeouts

Always use --connect-timeout. Without it, if the server is halfway through a crash, the script might hang forever waiting for a packet that will never come.

2. User-Agent Strings

Some firewalls block the default "curl" user agent. Use -A "Mozilla/5.0" to make your monitoring script look like a standard web browser.

3. Log Rotation

If you run this monitor 24/7, your uptime.csv will grow very large. Periodically archive older logs or clear the file if it exceeds a certain size.

Conclusions

Building a web service monitor with a Batch script is a fast, lightweight alternative to complex enterprise monitoring tools. By leveraging the power of curl and simple loops, you gain real-time visibility into your infrastructure's health. This proactive approach ensures you are the first to know when a service fails, allowing you to react and resolve issues before they impact your end-users.