Bir web sitesinin veya API servisinin kesintisiz erişilebilir olması, dijital dünyada güvenilirlik ve gelir sürekliliğinin temel şartıdır. Beklenmedik bir sunucu çökmesi, Nginx/Apache yapılandırma hatası, süresi dolan bir SSL sertifikası veya veritabanı kilitlenmesi dakikalar içinde binlerce kullanıcının sitenize erişememesine ve ciro kaybına yol açabilir. Çoğu işletme bu kesintileri öfkeli bir müşterinin destek mesajıyla öğrenir. Bir cron job aracılığıyla kurulan otomatik izleme (uptime monitoring) mekanizması, sitenizi düzenli aralıklarla yoklayarak sorunları kullanıcı bildirimlerinden önce fark etmenizi sağlayabilir.
Bu rehberde, Linux komut satırı araçları (özellikle curl) ve Python kullanarak kendi web sitelerinizin durumunu nasıl izleyeceğinizi, HTTP yanıt kodlarını ve milisaniye bazında gecikme sürelerini nasıl ayrıştıracağınızı, kesinti anında Telegram ve e-posta uyarı sistemlerini nasıl kuracağınızı inceleyeceğiz. Ayrıca içeriden izlemenin doğurduğu paradoksu ve harici bulut servisleriyle izlemenin neden hayati olduğunu ele alacağız.
Hedef kitle: Kendi sunucu filosunu veya web projelerini izlemek isteyen sistem yöneticileri, backend geliştiricileri ve DevOps uzmanlarıdır. Bildirim kurulumları için ayrıca cron e-posta gönderme rehberimizi inceleyebilirsiniz.
Cron ile Uptime Monitoring Mimarisi: Avantajlar ve Sınırlar
Uptime monitoring, bir hedef adrese düzenli aralıklarla ağ isteği göndererek servisin ayakta olup olmadığını (liveness) ve beklenen yanıtı verip vermediğini (readiness) doğrulama işlemidir. Sistem yöneticileri için bu süreci Linux cron job ile otomatize etmenin cazip avantajları vardır:
- Maliyet Sıfırdır: Ek bir yazılım lisansı satın almadan, mevcut sunucunuzdaki yerel komut satırı araçlarıyla çalışır.
- Tam Özelleştirme: Yalnızca ana sayfayı değil; kimlik doğrulama gerektiren özel JSON API uç noktalarını, yanıt başlıklarını ve gövde içeriklerini esnekçe kontrol edebilirsiniz.
- Gecikme (Latency) Ölçümü: Sayfa yükleme süresindeki kademeli artışları kaydederek potansiyel performans darboğazlarını erkenden tespit edebilirsiniz.
Ancak yerel cron ile izleme kurmanın çok kritik bir sınırı vardır: tek bir sunucuya bağımlılık.
"İçeriden İzleme" Paradoksu: Kendi Sunucunu Kendin İzleyebilir misin?
İzleme mimarisinde en sık düşülen tuzak, bir sunucunun kendi kendini denetlemesidir. Eğer izleme yapan cron job betiği, izlediği web sitesiyle aynı sunucuda veya aynı yerel ağda çalışıyorsa ciddi bir paradoks ortaya çıkar:
Sunucu çökerse üzerindeki izleme cron'u da çöker. Sunucunun donanımı arızalandığında, kernel panic oluştuğunda, veri merkezinin ana fiber hattı koptuğunda veya elektrik kesildiğinde, kontrolü yapması gereken cron betiği de çalışmayı durdurur. Sonuç olarak hiçbir uyarı tetiklenemez; çünkü alarmı çalacak mekanizma da yangının içinde kalmıştır.
Ayrıca yerel sunucudan localhost veya yerel IP üzerinden yapılan istekler, harici DNS çözümlemesini, CDN (Cloudflare) katmanını, sınır güvenlik duvarlarını (WAF) ve genel internet yönlendirmesini test edemez. Siteniz sunucunun içinden mükemmel bir şekilde HTTP 200 dönerken, dünya genelindeki kullanıcılar için erişilemez durumda olabilir. Bu nedenle profesyonel izleme her zaman dış bir ağdan (outside-in) yapılmalıdır. Yoklama yönünü tersine çevirip görevin kendisinin dışarıya düzenli sinyal gönderdiği "ölü adam anahtarı" desenini tercih edecekseniz cron heartbeat izleme rehberindeki kurulum örnekleri daha uygundur.
Adım Adım Kurulum: Bash ve curl ile HTTP Durum Kontrolü
Ayrı bir kontrol sunucusundan veya Linux makinesinden web sitelerinizi yoklamak için en güçlü ve hafif araç curl komutudur. Adım adım kurulum adımları şunlardır:
- İzlenecek web sitesi adreslerini ve beklenen HTTP durum kodlarını (genellikle 200 veya 301) belirleyin.
curlaracını gövdeyi yutan ve sadece durum kodunu döndüren parametrelerle yapılandırın.- Gecikme süresi (latency) ve SSL geçerlilik kontrollerini ekleyin.
- Hata anında hemen alarm üretmek yerine anlık ağ parazitlerini elemek için ardışık kontrol mekanizması kurun.
- Scripti
chmod +xile çalıştırılabilir yapıpcrontab -eile her 1 veya 5 dakikada bir çalışacak şekilde zamanlayın.
Yanıt Kodu, Gecikme Süresi ve SSL Geçerliliğini Ölçme
curl komutu arka plan izleme betiklerinde kullanıldığında terminal çıktısını kirletmemeli, web sayfasının HTML gövdesini terminale yazmamalı ve hızlıca yalnızca durum bilgisini vermelidir. Bunun için şu bayrak kombinasyonu kullanılır:
HTTP_KODU=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "https://siteniz.com")
Bu komuttaki bayrakların görevleri:
-s(silent): İlerleme çubuğunu ve hata mesajlarını gizler.-o /dev/null: İndirilen HTML/JSON gövdesini diske yazmadan atar; gövde yine indirilir ve aktarım sırasında bellek kullanılır.-w "%{http_code}": İstek tamamlandığında ekrana yalnızca üç basamaklı HTTP durum kodunu (örneğin 200, 404, 500) yazdırır.--max-time 10: Hedef sunucu 10 saniye içinde yanıt vermezse işlemi keser (timeout); cron betiğinin askıda kalmasını önler.
Yanıt süresini saniye cinsinden ölçmek için -w "%{time_total}" kullanılır; milisaniye için sonuç 1000 ile çarpılır. SSL sertifikası geçerlilik kontrolü için ise cron SSL yenileme süreçlerinde de başvurulan OpenSSL veya curl çıkış kodları denetlenir.
Uyarı Entegrasyonları: Kesinti Anında Telegram ve E-Posta Bildirimi
Kesinti tespit edildiğinde ekibin anında haberdar edilmesi gerekir. En pratik iki kanal Telegram Bot API ve yerel e-posta servisidir.
Telegram Bot API üzerinden mesaj göndermek için sunucuda karmaşık kütüphaneler kurmaya gerek yoktur; tek bir HTTP POST isteği yeterlidir:
# Telegram bildirim gonderme fonksiyonu
TELEGRAM_BOT_TOKEN="123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ"
CHAT_ID="987654321"
telegram_bildir() {
local MESAJ="$1"
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-d "chat_id=${CHAT_ID}" \
-d "text=${MESAJ}" \
-d "parse_mode=HTML" > /dev/null
}
Bot token üretme, chat id bulma ve hata mesajlarını biçimlendirme adımlarının tamamı için cron Telegram bildirim kanalları rehberimize bakabilirsiniz.
Gerçek Kod Örnekleri
Aşağıda üretim ortamında güvenle kullanabileceğiniz iki farklı izleme senaryosu yer almaktadır.
1. Bash: Yanlış Alarmları Önleyen ve Telegram Bildirimi Atan Shell Betiği
Bu script, hedef site başarısız olduğunda 5 saniye bekleyip ikinci kez kontrol eder (False Positive koruması). Kesinti devam ediyorsa Telegram üzerinden acil durum uyarısı iletir. Dosyayı /usr/local/bin/site-monitor.sh olarak kaydedin.
#!/bin/bash
# /usr/local/bin/site-monitor.sh - Cron: */2 * * * *
set -u
HEDEF_URL="https://siteniz.com"
DURUM_DOSYASI="/tmp/siteniz_monitor.state"
TELEGRAM_BOT_TOKEN="BOT_TOKEN_BURAYA"
CHAT_ID="CHAT_ID_BURAYA"
telegram_gonder() {
local METIN="$1"
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-d "chat_id=${CHAT_ID}" \
-d "text=${METIN}" > /dev/null
}
# Ilk kontrol
HTTP_KODU=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$HEDEF_URL") || HTTP_KODU=000
# Eger yanit 200 degilse, anlik dalgalanmayi elemek icin 5 saniye sonra tekrar dene
if [ "$HTTP_KODU" -ne 200 ]; then
sleep 5
HTTP_KODU=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$HEDEF_URL") || HTTP_KODU=000
fi
# Onceki durum kontrolu (Surekli spam bildirim gitmesini engellemek icin)
ONCEKI_DURUM="UP"
if [ -f "$DURUM_DOSYASI" ]; then
ONCEKI_DURUM=$(cat "$DURUM_DOSYASI")
fi
if [ "$HTTP_KODU" -ne 200 ]; then
echo "DOWN" > "$DURUM_DOSYASI"
if [ "$ONCEKI_DURUM" != "DOWN" ]; then
TARIH=$(date '+%Y-%m-%d %H:%M:%S')
telegram_gonder "ACIL: $HEDEF_URL erisilemiyor! Durum Kodu: $HTTP_KODU Zaman: $TARIH"
fi
else
echo "UP" > "$DURUM_DOSYASI"
if [ "$ONCEKI_DURUM" == "DOWN" ]; then
TARIH=$(date '+%Y-%m-%d %H:%M:%S')
telegram_gonder "DUZELDI: $HEDEF_URL tekrar yayinda. Durum Kodu: 200 Zaman: $TARIH"
fi
fi
Betiği her 2 dakikada bir çalıştırmak için crontab satırı:
*/2 * * * * /usr/local/bin/site-monitor.sh > /dev/null 2>&1
2. Python: Çoklu URL ve Milisaniye Yanıt Süresi İzleme Scripti
Birden fazla web sitesini ve API mikroservisini denetlemek için Python scripti:
#!/usr/bin/env python3
# /usr/local/bin/multi_monitor.py
import urllib.request
import urllib.error
import time
HEDEFLER = [
{"url": "https://siteniz.com", "ad": "Ana Sayfa"},
{"url": "https://api.siteniz.com/health", "ad": "Kullanici API"},
]
for hedef in HEDEFLER:
baslangic = time.time()
try:
req = urllib.request.Request(
hedef["url"],
headers={"User-Agent": "SiteMonitor/1.0"}
)
with urllib.request.urlopen(req, timeout=10) as response:
gecen_sure = round((time.time() - baslangic) * 1000, 2)
kod = response.getcode()
print(f"[OK] {hedef['ad']}: HTTP {kod} - {gecen_sure} ms")
except urllib.error.HTTPError as e:
print(f"[HATA] {hedef['ad']}: HTTP {e.code}")
except urllib.error.URLError as e:
print(f"[KESINTI] {hedef['ad']}: Baglanti basarisiz - {e.reason}")
Sık Karşılaşılan Hatalar ve Çözümleri
Uptime monitoring sistemlerinde en sık karşılaşılan curl hata kodları ve kök nedenleri:
curl: (28) Operation timed out after 10000 milliseconds
Neden: Hedef sunucunun aşırı işlemci yükü, veritabanı kilitlenmesi veya ağ tıkanıklığı nedeniyle HTTP aktarımının belirlenen toplam süre (10 saniye) içinde tamamlanamaması.
Çözüm: Komuttaki --max-time değerini kontrol edin. Sunucu üzerindeki web servisinin (Nginx/Apache) ve veritabanı servisinin kaynak kullanımını analiz edin. Betiğinizde tek seferlik gecikmelerde alarm üretmemek için ardışık başarısızlık doğrulaması uygulayın.
curl: (60) SSL certificate problem: certificate has expired
Neden: Hedef web sitesinin SSL/TLS sertifikasının süresinin dolması veya Let's Encrypt ara sertifika zincirinin sunucuda eksik yapılandırılması.
Çözüm: Sertifikayı hemen yenileyin. Asla curl -k (insecure) parametresi ekleyerek hatayı görmezden gelmeyin; çünkü gerçek kullanıcılar tarayıcılarında kırmızı güvenlik uyarısıyla karşılaşmaya devam edecektir.
curl: (7) Failed to connect to host: Connection refused
Neden: Hedef sunucudaki Nginx veya Apache servisinin çökmüş olması ya da sunucu güvenlik duvarının (iptables, UFW) izleme IP adresinden gelen 80/443 port bağlantılarını engellemesi.
Çözüm: Sunucuya SSH ile bağlanıp web servis durumunu (systemctl status nginx) kontrol edin ve servisi yeniden başlatın. Güvenlik duvarı kurallarında HTTP/HTTPS portlarının açık olduğundan emin olun.
Anlık Ağ Dalgalanmalarında Yanlış Alarm (False Positive) Üretilmesi
Neden: İnternet omurgasında yaşanan 1-2 saniyelik mikro paket kayıplarında betiğin tek bir denemeyle hemen "Site çöktü!" uyarısı atması.
Çözüm: Script içine 3 ardışık başarısızlık eşiği ekleyin. İlk istek başarısız olduğunda 5 saniye bekleyip tekrar deneyin; yalnızca üst üste başarısız olan kontrollerde bildirim gönderin. Cron sisteminiz genel olarak tetiklenmiyorsa cron job çalışmıyor kılavuzundaki kontrolleri yapın.
cronjob.com.tr ile HTTP Tabanlı Alternatif Kurulum
Kendi sunucunuzdan uptime monitoring yapmanın getirdiği "içeriden izleme" sınırlarını aşmak ve sunucu çökmesinden yoklama ve bildirim eşiklerine bağlı olarak haberdar olmak için bağımsız bir dış servis kullanmak en sağlıklı yaklaşımdır. cronjob.com.tr, web sitelerinizi ve API uç noktalarınızı bağımsız bulut altyapısından düzenli aralıklarla yoklar.
- cronjob.com.tr üzerinde ücretsiz hesap oluşturun (kayıt sırasında kredi kartı istenmez).
- Yeni görev ekleme ekranında izlemek istediğiniz sitenin tam adresini girin:
https://siteniz.com. - HTTP metodunu GET veya hafif kontrol için HEAD olarak seçin.
- Zamanlama sıklığını 60 saniyeden başlayan hazır aralıklardan biriyle veya 5 alanlı cron ifadesiyle belirleyin.
- İzleme hassasiyetini belirleyin: cronjob.com.tr, HTTP 200–399 durum kodlarını başarılı sayar. Yanıt süresi aralığa göre dinamik belirlenir (1 dakikalık işlerde 55 saniye, 5 dakika ve üzeri işlerde 290 saniye).
- Ardışık hata eşiği (varsayılan 3, 1–20 arası ayarlanabilir) aşıldığında sistem otomatik olarak "erişim sorunu" e-postası iletir. Site tekrar normale döndüğünde ise toplam kesinti süresini belirten "düzeldi" e-postası gönderilir.
Platform üzerinden gerçekleştirilen her kontrolün durum kodu, yanıt süresi ve ilk ~64 KB yanıt gövdesi 7 gün boyunca loglarda saklanır. Böylece sitenizin gün içindeki yanıt süresi dalgalanmalarını log kayıtları üzerinden takip edebilirsiniz. Detaylı bilgi için ücretsiz cron job servisi sayfamızı ziyaret edebilirsiniz.
Sıkça Sorulan Sorular (SSS)
Cron ile uptime monitoring yapmak profesyonel izleme servislerinin yerini tutar mı?
Yerel cron betikleri basit kontroller ve iç servis izleme için yeterlidir; ancak sunucu donanımı çöktüğünde veya ağ kesildiğinde üzerindeki cron da çalışamayacağı için profesyonel dış izleme servislerinin yerini tutamaz. Kesintisiz takip için dışarıdan HTTP yoklaması yapan servisler şarttır.
Curl ile sadece HTTP durum kodunu nasıl alırım?
curl -s -o /dev/null -w "%{http_code}" https://example.com komutu gövdeyi yutarak doğrudan üç basamaklı HTTP durum kodunu döner. Bu komut terminal çıktısını kirletmeden durum kodunu doğrudan bir değişkene atamak için idealdir.
Kontrol sıklığı ne olmalıdır?
E-ticaret ve ödeme altyapıları gibi kritik sistemler için 1 dakikalık kontrol aralığı önerilir. Standart kurumsal web siteleri ve bloglar için ise 3 ile 5 dakikalık aralıklar sunucuya gereksiz yük bindirmeden kesintileri hızlıca yakalamak için yeterlidir.
Heartbeat (Dead Man's Snitch) nedir?
Sunucunun veya cron görevinin düzenli aralıklarla dışarıdaki bir izleme servisine sinyal (ping) göndermesi mimarisidir. Eğer dış servis beklenen süre içinde sinyal alamazsa sunucunun veya cron'un çöktüğünü anlayarak yöneticiye otomatik alarm gönderir.
Sonuç
Web sitenizin erişilebilirliğini garanti altına almak için hem yerel komut satırı araçlarından hem de bağımsız dış izleme platformlarından yararlanmalısınız. Bash ve curl ile oluşturduğunuz hafif kontroller iç servis sağlığını doğrularken, dışarıdan HTTP yoklaması yapan servisler sunucu çökmelerini anında yakalamanızı sağlar.
Hemen Ücretsiz Uptime ve Cron İzleme Başlatın
cronjob.com.tr ile web sitelerinizi dakikada bir dışarıdan kontrol edin. Ardışık hata eşiği aşıldığında e-posta uyarısı alın; aynı iş için bildirimler arasında en az 60 dakika bulunur. 7 günlük performans loglarını ücretsiz inceleyin.
Ücretsiz Başla →