DevOps Bootcamp · Ders

Sistem Durumu Denetimi ve Uyarı Betikleri Oluşturma

Yük, bellek ve disk ölçümlerini toplayın; zamanlanmış betiklerden eşik tabanlı uyarılar oluşturun.

4. ders / 413 adım

Sistem Durumu Denetimi ve Uyarı Betikleri Oluşturma, CoddyKit'te ücretsiz bir DevOps Bootcamp dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, DevOps Bootcamp öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. DevOps Bootcamp kursu toplamda 4 dersten oluşur.

Sistem Sağlık Denetimleri Neden Önemlidir

Üretim sunucuları sessizce kötüleşebilir. CPU sıçramaları, bellek sızıntıları ve dolu diskler kesintilere yol açar — ancak yalnızca kimse zamanında fark etmezse. Sistem sağlık denetimi betikleri izleme döngüsünü otomatikleştirir: ölçümleri toplar, eşiklerle karşılaştırır ve kullanıcılar sorunu hissetmeden önce uyarılar gönderir.

  • cron ile zamanlanarak insan müdahalesi olmadan birkaç dakikada bir çalışırlar
  • Günlük toplama için uygun, tutarlı ve zaman damgalı çıktı üretirler
  • Eşik tabanlı mantık uyarıları anlamlı tutar — her küçük aksaklık nöbetçi ekibe bildirim göndermez

Bu derste yük ortalaması, bellek baskısı ve disk kullanımını katman katman ele alarak sıfırdan üretim kalitesinde bir sağlık denetimi betiği oluşturacaksınız.

Yük Ortalamasını Yakalama

Linux, 1 dakikalık, 5 dakikalık ve 15 dakikalık yük ortalamalarını /proc/loadavg ve uptime komutu aracılığıyla sunar. Betik yazımı için /proc/loadavg en temiz kaynaktır — yerel ayar sorunları ve dağıtımlar arasındaki ayrıştırma farklılıkları yoktur.

Aşağıdaki kod parçası 1 dakikalık yük ortalamasını okur ve eşik karşılaştırması için bir değişkende saklar. cut ilk alanı çıkarır; awk ise bc kullanarak kayan nokta aritmetiğiyle tamsayı karşılaştırması yapabilmek için ondalık kısmı kaldırır.

#!/usr/bin/env bash
# Read 1-minute load average from /proc/loadavg
LOAD_RAW=$(cut -d' ' -f1 /proc/loadavg)
echo "Raw load average: $LOAD_RAW"

# Number of CPU cores — used to normalise load
CPU_CORES=$(nproc)
echo "CPU cores: $CPU_CORES"

# Compute load percentage (load / cores * 100) using bc
LOAD_PCT=$(echo "scale=2; $LOAD_RAW / $CPU_CORES * 100" | bc)
echo "Load %: $LOAD_PCT"

Kayan Noktalı Değerlerle Eşik Karşılaştırması

Bash, kayan noktalı sayıları yerel olarak karşılaştıramaz — [ 1.5 -gt 1.2 ] bir hata üretir. Yaygın iki çözüm şunlardır:

  • bc — bir karşılaştırma ifadesinden 1 (doğru) veya 0 (yanlış) üretir
  • awk — bir işlem hattı içinde kayan noktalı koşulları değerlendirebilir

bc kullanmak mantığı okunabilir ve kolayca sınanabilir tutar. $(echo "$A > $B" | bc) kalıbı koşul sağlandığında 1 döndürür; bunu [ ... -eq 1 ] ile denetlersiniz.

#!/usr/bin/env bash
LOAD_RAW=$(cut -d' ' -f1 /proc/loadavg)
CPU_CORES=$(nproc)
THRESHOLD=80  # alert when load % exceeds 80%

LOAD_PCT=$(echo "scale=2; $LOAD_RAW / $CPU_CORES * 100" | bc)

# bc returns 1 if the expression is true
if [ "$(echo "$LOAD_PCT > $THRESHOLD" | bc)" -eq 1 ]; then
    echo "ALERT: Load is ${LOAD_PCT}% (threshold ${THRESHOLD}%)"
else
    echo "OK: Load is ${LOAD_PCT}%"
fi

Bellek Ölçümlerini Toplama

/proc/meminfo, Linux'taki bellek istatistikleri için yetkili kaynaktır. Önemli alanlar:

  • MemTotal — kB cinsinden toplam fiziksel RAM
  • MemAvailable — takaslama yapmadan yeni ayırmalar için kullanılabilir olduğu tahmin edilen kB miktarı (MemFree değerinden daha iyidir)

Bu değerleri çıkarmanın en temiz yolu, desen eşleştirmeyle birlikte awk kullanmaktır. MemAvailable değerini MemTotal değerine bölüp 100'den çıkarmak, uyarı eşiğinizi belirleyen kullanılmış bellek yüzdesini verir.

#!/usr/bin/env bash
# Extract memory figures from /proc/meminfo (values in kB)
MEM_TOTAL=$(awk '/^MemTotal:/ {print $2}' /proc/meminfo)
MEM_AVAIL=$(awk '/^MemAvailable:/ {print $2}' /proc/meminfo)

# Used memory percentage
MEM_USED_PCT=$(echo "scale=2; (1 - $MEM_AVAIL / $MEM_TOTAL) * 100" | bc)

echo "Total RAM : ${MEM_TOTAL} kB"
echo "Available : ${MEM_AVAIL} kB"
echo "Used      : ${MEM_USED_PCT}%"

Disk Kullanımı Ölçümlerini Toplama

df komutu dosya sistemi kullanımını bildirir. Betik yazımı için iki seçenek önemlidir:

  • -h — insan tarafından okunabilir boyutlar (yalnızca görüntüleme içindir; aritmetikte kullanmayın)
  • --output=pcent,target — makine tarafından ayrıştırılabilir sütunlar (GNU coreutils)

Bağlanmış tüm dosya sistemleri üzerinde yineleme yapmak, betiğin yalnızca / bölümünü değil, kritik ölçüde dolu olan her bölümü işaretlemesini sağlar. Tamsayı karşılaştırmasından önce % işareti tr -d '%' ile kaldırılır.

#!/usr/bin/env bash
DISK_THRESHOLD=85

# Skip header line with tail -n +2
# --output=pcent,target gives "85% /var" style lines
df --output=pcent,target | tail -n +2 | while read -r USED_PCT MOUNT; do
    # Remove the % sign for arithmetic
    USED_INT=${USED_PCT//%/}

    if [ "$USED_INT" -ge "$DISK_THRESHOLD" ]; then
        echo "ALERT: Disk $MOUNT is ${USED_PCT} full"
    else
        echo "OK   : Disk $MOUNT is ${USED_PCT} full"
    fi
done

Zaman Damgalı Yapılandırılmış Uyarı Çıktısı

Zaman damgası içermeyen uyarı iletileri günlük dosyalarında veya e-posta raporlarında neredeyse işe yaramaz. Tutarlı bir ön ek, günlük ayrıştırmayı grep veya günlük aktarım aracılıklarıyla kolaylaştırır.

Betiğinizin en üstünde küçük bir uyarı işlevi tanımlayın. Bu işlev bir ISO-8601 zaman damgası, önem düzeyi ve denetim adını başa ekler. Tüm uyarılar tee aracılığıyla hem stdout'a hem de bir günlük dosyasına yazılır.

  • date -u +"%Y-%m-%dT%H:%M:%SZ" — yerel ayarlardan bağımsız UTC zaman damgası
  • İşlem hatlarında sinyali gürültüden ayırmak için ALERT iletilerini stderr'a, OK iletilerini stdout'a yazın
#!/usr/bin/env bash
LOG_FILE="/var/log/healthcheck.log"

alert() {
    local LEVEL="$1"   # OK | WARN | ALERT
    local CHECK="$2"
    local MSG="$3"
    local TS
    TS=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
    local LINE="[$TS] [$LEVEL] [$CHECK] $MSG"

    if [ "$LEVEL" = "ALERT" ]; then
        echo "$LINE" | tee -a "$LOG_FILE" >&2
    else
        echo "$LINE" | tee -a "$LOG_FILE"
    fi
}

# Usage examples
alert "OK"    "DISK"  "/ is 42% full"
alert "ALERT" "DISK"  "/var is 91% full"

mail ve sendmail ile E-posta Uyarıları Gönderme

Sunucuda kullanılabilecek en basit uyarı mekanizması, yerel MTA (postfix, sendmail veya msmtp) üzerinden e-postadır. (mailutils veya bsd-mailx paketindeki) mail komutu, iletiyi tek satırda oluşturup gönderir.

  • -s — konu satırı
  • İleti gövdesini stdin üzerinden aktarın
  • Yerel MTA bulunmayan sunucularda mail yerine işlemsel e-posta API'sine yapılan bir curl çağrısı kullanın

Gürültülü tek bir koşulun gelen kutusunu doldurmaması için gönderimi bir yinelenen ileti önleme kilidiyle koruyun.

#!/usr/bin/env bash
ALERT_EMAIL="ops@example.com"
LOCK_DIR="/tmp/healthcheck_locks"
mkdir -p "$LOCK_DIR"

send_alert() {
    local CHECK="$1"
    local MSG="$2"
    local LOCK="$LOCK_DIR/${CHECK}.lock"

    # Only send if no lock exists (prevents repeated emails within the hour)
    if [ ! -f "$LOCK" ]; then
        echo "$MSG" | mail -s "[ALERT] $CHECK on $(hostname)" "$ALERT_EMAIL"
        touch "$LOCK"
        # Lock expires after 1 hour via cron or find+delete
        echo "Alert sent for $CHECK"
    else
        echo "Alert suppressed for $CHECK (lock active)"
    fi
}

send_alert "HIGH_LOAD" "Load average exceeded 80% on $(hostname) at $(date)"

Tam Sağlık Denetimi Betiğini Oluşturma

Şimdi üç denetimin (yük, bellek ve disk) tümünü, üst kısmında yapılandırılabilir eşiklerin bulunduğu, bütünlüklü tek bir betikte birleştireceksiniz. Üretim ortamlarındaki sistem yöneticisi otomasyonunda kullanılan yaklaşım budur:

  • Mantığı düzenlemek zorunda kalmadan kolayca ayarlayabilmek için sabitleri üst kısımda tanımlama
  • Okunabilirlik ve birim testlerine uygunluk için her denetimi ayrı bir işlevde yalıtma
  • Çağrıları bir main işlevinin düzenlemesi
  • Herhangi bir uyarı üretildiyse çıkış kodu 1, aksi durumda 0 — bu, betiğin Nagios/Icinga gibi izleme çatılarında birleştirilebilir olmasını sağlar
#!/usr/bin/env bash
set -euo pipefail

# ── Thresholds ───────────────────────────────────────────
LOAD_THRESHOLD=80   # percent of CPU capacity
MEM_THRESHOLD=90    # percent used
DISK_THRESHOLD=85   # percent used
ALERT_EMAIL="ops@example.com"
LOG_FILE="/var/log/healthcheck.log"
ALERT_FIRED=0

# ── Helpers ──────────────────────────────────────────────
ts()    { date -u +"%Y-%m-%dT%H:%M:%SZ"; }
log()   { echo "[$(ts)] $*" | tee -a "$LOG_FILE"; }
alert() { log "ALERT: $*"; echo "$*" | mail -s "[ALERT] $(hostname)" "$ALERT_EMAIL" 2>/dev/null; ALERT_FIRED=1; }

# ── Checks ───────────────────────────────────────────────
check_load() {
    local raw cores pct
    raw=$(cut -d' ' -f1 /proc/loadavg)
    cores=$(nproc)
    pct=$(echo "scale=2; $raw / $cores * 100" | bc)
    if [ "$(echo "$pct > $LOAD_THRESHOLD" | bc)" -eq 1 ]; then
        alert "Load ${pct}% exceeds ${LOAD_THRESHOLD}%"
    else
        log "OK load=${pct}%"
    fi
}

check_memory() {
    local total avail pct
    total=$(awk '/^MemTotal:/    {print $2}' /proc/meminfo)
    avail=$(awk '/^MemAvailable:/{print $2}' /proc/meminfo)
    pct=$(echo "scale=2; (1 - $avail / $total) * 100" | bc)
    if [ "$(echo "$pct > $MEM_THRESHOLD" | bc)" -eq 1 ]; then
        alert "Memory ${pct}% used (threshold ${MEM_THRESHOLD}%)"
    else
        log "OK memory=${pct}%"
    fi
}

check_disk() {
    df --output=pcent,target | tail -n +2 | while read -r used mnt; do
        local pct_int=${used//%/}
        if [ "$pct_int" -ge "$DISK_THRESHOLD" ]; then
            alert "Disk $mnt at ${used}"
        else
            log "OK disk $mnt=${used}"
        fi
    done
}

main() {
    log "=== Health check START ==="
    check_load
    check_memory
    check_disk
    log "=== Health check END (alerts=$ALERT_FIRED) ==="
    exit "$ALERT_FIRED"
}

main

Cron ile Zamanlama

Bir sağlık denetimi betiği yalnızca otomatik olarak çalıştırıldığında değer sağlar. cron, Unix sistemlerindeki standart zamanlayıcıdır. Betiğinizi zamanlamak için sistem genelindeki crontab'ı veya /etc/cron.d/ içindeki özel bir dosyayı düzenleyin.

  • Her 5 dakikada bir çalıştırma: */5 * * * *
  • Cron'da her zaman mutlak yollar kullanın — cron ortamındaki $PATH sınırlıdır
  • Cron'un her çalışmada e-posta göndermesini önlemek için çıktıyı yönlendirin: >> /var/log/healthcheck.log 2>&1
  • Cron'un kendi e-postalarını susturmak için crontab'ın üst kısmında MAILTO="" kullanın
# /etc/cron.d/healthcheck
# Run the health check every 5 minutes as root
MAILTO=""
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

*/5 * * * * root /usr/local/sbin/healthcheck.sh >> /var/log/healthcheck.log 2>&1

Bekleme Süresi Kilitleriyle Uyarı Fırtınalarını Önleme

Bir eşik sürekli aşıldığında, basit bir betik her 5 dakikada bir uyarı üretir; bir mühendisin yanıt verebilmesinden önce onlarca e-posta gönderilebilir. Bir bekleme süresi kilidi, yapılandırılabilir bir süre boyunca yinelenen uyarıları bastırır.

Yaklaşım şöyledir: ilk uyarıda bir kilit dosyası yazın; dosya, bekleme süresinden daha yeni olduğu sürece sonraki uyarıları atlayın; find ile -mmin kullanarak tarih hesaplaması yapmadan dosyanın yaşını atomik biçimde denetleyin.

#!/usr/bin/env bash
LOCK_DIR="/tmp/hc_locks"
COOLDOWN_MIN=60  # suppress repeat alerts for 60 minutes
mkdir -p "$LOCK_DIR"

should_alert() {
    local check="$1"
    local lock="$LOCK_DIR/${check}.lock"

    if [ ! -f "$lock" ]; then
        # No lock — allow alert and create lock
        touch "$lock"
        return 0  # true: send alert
    fi

    # Lock exists — check if it is older than the cooldown
    # find returns the filename only if it's OLDER than COOLDOWN_MIN
    local expired
    expired=$(find "$lock" -mmin +"$COOLDOWN_MIN" 2>/dev/null)

    if [ -n "$expired" ]; then
        touch "$lock"  # refresh lock timestamp
        return 0       # cooldown expired — allow alert
    fi

    return 1  # still within cooldown — suppress
}

# Usage
if should_alert "HIGH_LOAD"; then
    echo "Sending load alert..."
    # mail -s "..." ops@example.com <<< "Load too high"
else
    echo "Load alert suppressed (cooldown active)"
fi

Sağlık Denetimi Betiğinizi Test Etme ve Doğrulama

Dağıtımdan önce betiği üç şekilde doğrulayın:

  • Sözdizimi denetimi: bash -n healthcheck.sh, betiği çalıştırmadan ayrıştırma hatalarını yakalar
  • İzleme kipi: bash -x healthcheck.sh, yürütülen her komutu yazdırır; hata ayıklama için son derece değerlidir
  • Eşik geçersiz kılma: Betiğin sağlıklı bir ana bilgisayarda uyarı üretmesini sağlamak için eşikleri geçici olarak sıfıra yaklaştırın; böylece uyarı yolunun uçtan uca çalıştığını doğrulayın

E-posta yolu için test sırasında MOCK_MAIL bayrağını kullanarak mail çıktısını bir günlük dosyasına yönlendirin:

#!/usr/bin/env bash
# Smoke-test the alert path without sending real email
MOCK_MAIL=true
ALERT_EMAIL="ops@example.com"

send_mail() {
    local subject="$1"
    local body="$2"
    if [ "$MOCK_MAIL" = true ]; then
        echo "[MOCK MAIL] To: $ALERT_EMAIL | Subject: $subject"
        echo "[MOCK MAIL] Body: $body"
    else
        echo "$body" | mail -s "$subject" "$ALERT_EMAIL"
    fi
}

# Override threshold to guarantee an alert fires
LOAD_THRESHOLD=0   # Any load will exceed 0%
LOAD_RAW=$(cut -d' ' -f1 /proc/loadavg)
CPU_CORES=$(nproc)
PCT=$(echo "scale=2; $LOAD_RAW / $CPU_CORES * 100" | bc)

if [ "$(echo "$PCT > $LOAD_THRESHOLD" | bc)" -eq 1 ]; then
    send_mail "[ALERT] Load on $(hostname)" "Load is ${PCT}%"
fi

Bilgi Denetimi: Bekleme Süresi Stratejisi

Şu senaryoyu düşünün: sağlık denetimi cron göreviniz her 5 dakikada bir çalışıyor. /var disk kullanımı %85'i aşıyor ve 3 saat boyunca bu düzeyde kalıyor. Nöbetçi mühendisin her 5 dakikada bir değil, saatte bir uyarı almasını istiyorsunuz. Hangi uygulama stratejisi en uygundur?

Ders Özeti: Sistem Sağlığı Denetimi Betikleri

Bu derste üretime hazır, eksiksiz bir sistem sağlığı denetimi ve uyarı işlem hattı oluşturdunuz. İleride de kullanmanız gereken temel ilkeler şunlardır:

  • Doğrunun kaynağı: Metrikleri /proc/loadavg ve /proc/meminfo dosyalarından okuyun; bu dosyalar kararlı, yerel ayarlardan bağımsız ve her Linux ana bilgisayarında kullanılabilir durumdadır
  • Ondalık aritmetik: Ondalıklı eşik karşılaştırmaları için bc kullanın; Bash'teki tamsayı karşılaştırması (-gt) yalnızca tam sayılarla çalışır
  • Diskleri dolaşma: Yalnızca / dosya sistemini değil, bağlanmış her dosya sistemini denetlemek için df --output=pcent,target kullanın
  • Yapılandırılmış günlükleme: Günlüklerin grep ile aranmasını kolaylaştırmak ve merkezi günlükleme sistemlerine sorunsuz aktarılmasını sağlamak için her satırın başına UTC zaman damgası ve önem düzeyi ekleyin
  • Bekleme süresi kilitleri: find -mmin ile denetlenen kilit dosyaları, cron zamanlamasını değiştirmeden uyarı fırtınalarını önler
  • Birleştirilebilirlik: Herhangi bir uyarı üretildiğinde 1 koduyla çıkın; böylece betik Nagios, Icinga veya diğer izleme çatılarıyla bütünleşir
  • Test: Sözdizimi denetimleri için bash -n, izleme yoluyla hata ayıklama için bash -x ve sağlıklı ana bilgisayarlarda uyarı yolunu doğrulamak için MOCK_MAIL bayrağını kullanın

Tamamlanmış betiği /etc/cron.d/ üzerinden zamanlayın; altyapınız sürekli olarak kendi kendini izleyecek ve yalnızca eşikler anlamlı biçimde aşıldığında uyarı verecektir.

Başlamak ücretsiz

Yapay zeka eğitmeniyle DevOps Bootcamp öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
142
Dersler
568

Sıkça Sorulan Sorular

“Sistem Durumu Denetimi ve Uyarı Betikleri Oluşturma” dersi ücretsiz mi?

Evet — “Sistem Durumu Denetimi ve Uyarı Betikleri Oluşturma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve DevOps Bootcamp kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. DevOps Bootcamp kursu toplamda 4 dersten oluşur.

“Sistem Durumu Denetimi ve Uyarı Betikleri Oluşturma” dersinde ne öğreneceğim?

Yük, bellek ve disk ölçümlerini toplayın; zamanlanmış betiklerden eşik tabanlı uyarılar oluşturun. DevOps Bootcamp ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

DevOps Bootcamp öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te DevOps Bootcamp, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Sistem Durumu Denetimi ve Uyarı Betikleri Oluşturma” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu DevOps Bootcamp dersinde kod yazıp çalıştırabilir miyim?

Evet. Her DevOps Bootcamp dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Kullanıcı ve Grup Sağlamayı Otomatikleştirme
  2. systemd Hizmetlerini Denetleme ve Unit Dosyaları Yazma
  3. Disk, Dosya Sistemi ve Bağlama Otomasyonu
  4. Sistem Durumu Denetimi ve Uyarı Betikleri Oluşturma
← DevOps Bootcamp Sayfasına Dön