It happened to me.
My site — bashsnippets.xyz — had been down for six hours before I knew
about it. I found out because a reader emailed me. Not because I checked.
Not because I had monitoring. Because someone else had to tell me.
That's the kind of thing that sits with you.
The fix took 20 minutes to build. Here's exactly what I wrote and why
every piece of it matters.
The problem with checking manually
The natural instinct is to just open a browser and load the page.
But that has two failure modes:
- You only check when you remember to
- You don't check at 2am when it actually goes down
What you want is automated, logged, and running while you sleep.
Start with the one-liner
Before building the full script, understand the core command:
curl -o /dev/null -s -w "%{http_code}" https://yoursite.com
Run it. It prints one number. That number is your site's HTTP status code.
Here's what each flag does — and this is worth understanding
because you'll use these flags for a lot more than uptime checking:
-o /dev/null — tells curl to discard the response body entirely.
You don't need the HTML. You only need the status code.
Without this flag, curl dumps the entire page to your terminal.
-s — silent mode. Suppresses the progress bar and error messages.
Without this, curl prints download stats you don't need.
-w "%{http_code}" — write-out format. Tells curl to print only
the HTTP status code after the request completes.
This is the only output you care about.
Result: just the number. Nothing else. Clean, parseable, scriptable.
$ curl -o /dev/null -s -w "%{http_code}" https://bashsnippets.xyz
200
Status codes you need to know
| Code | Meaning | What to do |
|---|---|---|
| 200 | Up and healthy | Nothing |
| 301/302 | Redirect — usually fine | Check it's intentional |
| 404 | Page not found | Check your URL |
| 503 | Server error — site is down | Investigate immediately |
| 000 | DNS failure / unreachable | Your server may be completely offline |
The full script
Now wrap it in logic that tells you what the number means:
#!/bin/bash
CHECK="✓"
CROSS="✗"
URL="https://bashsnippets.xyz"
STATUS=$(curl -o /dev/null -s -w "%{http_code}" "$URL")
if [ "$STATUS" -eq 200 ]; then
echo "$CHECK $URL is up (HTTP $STATUS)"
else
echo "$CROSS $URL returned HTTP $STATUS — check it"
fi
The $CHECK and $CROSS variables aren't required — you could hardcode
the symbols directly — but defining them at the top makes it trivial
to change the output format later and keeps the echo lines readable
at a glance.
Save this as uptime.sh in your home directory.
Make it executable
chmod +x ~/uptime.sh
chmod +x adds execute permission to the file. Without this,
bash treats it as a plain text file and refuses to run it.
This is the step people forget. Every time.
Test it manually before scheduling anything:
./uptime.sh
# ✓ https://bashsnippets.xyz is up (HTTP 200)
Schedule it with cron
A script you run manually is still manual monitoring.
The goal is automation — the script checks your site while you sleep.
Open your crontab:
crontab -e
Add this line:
*/5 * * * * ~/uptime.sh >> ~/uptime.log 2>&1
Breaking this down:
*/5 * * * * — run every 5 minutes. The */5 means "every 5th
minute of every hour of every day." Change to */1 to test it faster.
~/uptime.sh — the script to run. The ~/ expands to your
home directory — safer than a relative path.
>> ~/uptime.log — append output to a log file.
Using >> instead of > means each result adds to the file
rather than overwriting it. You want a history, not just the last result.
2>&1 — redirect stderr to stdout so errors also get logged.
Save and exit. Cron confirms: crontab: installing new crontab
Watch it run in real time
tail -f ~/uptime.log
tail -f watches a file and prints new lines as they're added.
Open this in a second terminal after setting up cron.
Within a minute you'll see the script run on its own —
no input from you, no trigger, just cron firing the script
and the result appearing in the log automatically.
That moment where the second line appears on its own —
that's the confirmation that automation is actually working.
The full copy-paste version
#!/bin/bash
CHECK="✓"
CROSS="✗"
URL="https://yoursite.com" # ← change this to your site
STATUS=$(curl -o /dev/null -s -w "%{http_code}" "$URL")
if [ "$STATUS" -eq 200 ]; then
echo "$CHECK $URL is up (HTTP $STATUS)"
else
echo "$CROSS $URL returned HTTP $STATUS — check it"
fi
Cron line to add with crontab -e:
*/5 * * * * ~/uptime.sh >> ~/uptime.log 2>&1
Full reference page with all variations:
→ bashsnippets.xyz/snippets/check-if-website-is-up.html
I post a new copy-paste bash script every week at bashsnippets.xyz.
All free. No signups. @BashSnippets on YouTube if you want to see these in 30-second form.
How do you monitor your sites? I'm genuinely curious what the rest of you are running 👇
Top comments (0)