Linux disk doluluk uyarısı: Telegram ve e-posta bildirimi gönderen bash betiği ve systemd timer kurulumu
Disk dolup MySQL ya da web servisi durmadan önce haber alın. Bu bash betiği tüm bölümlerde disk ve inode doluluğunu kontrol eder ve eşik aşılınca Telegram ile e-postadan linux disk doluluk uyarısı gönderir. Aynı uyarıyı tekrar tekrar yollamaz, sorun düzelince haber verir ve systemd timer ile çalışır.
sunucu.com.tr Ekibi13 dk okuma
Linux sunucularda disk genelde gece dolar ve sorunu çoğu zaman müşteriden duyarsınız: site açılmaz, veritabanı yazamaz, yedek yarıda kalır. Bu rehberde tüm bölümleri tarayan ve eşik aşılınca Telegram ya da e-postayla linux disk doluluk uyarısı gönderen bir bash betiğini adım adım kuruyoruz. Betik inode doluluğunu da ölçer, aynı uyarıyı her çalışmada yeniden göndermez ve sorun düzelince haber verir. Sistem yöneticileri ve kendi sunucusunu yöneten KOBİ'ler için hazırlandı.
Disk dolunca ne olur?
Disk dolduğunda yazma işlemi yapan her şey "No space left on device" hatası almaya başlar. Belirtiler genelde dolaylıdır:
- MySQL ve MariaDB binlog, geçici tablo ya da InnoDB dosyalarına yazamaz. Sorgular asılı kalır, bazen servis tamamen durur ve yeniden başlarken tabloları onarmak gerekebilir.
- Web servisleri günlük dosyalarına ve oturum (session) dosyalarına yazamaz. PHP sitelerinde oturum açılamaz, yüklemeler yarıda kalır.
- Paket yöneticisi güncelleme sırasında takılırsa paketler yarı kurulu kalabilir.
- Yedekleme betikleri yarım arşiv üretir ve bunu çoğu zaman fark etmezsiniz.
Bir de inode dolması var. df -h boş alan gösterdiği halde dosya oluşturulamıyorsa sorun büyük olasılıkla inode tükenmesidir. Milyonlarca küçük oturum dosyası, e-posta kuyruğu ya da önbellek dosyası buna yol açar. Bu yüzden betik yalnız yüzdeye değil inode kullanımına da bakar.
Ön koşullar
- Ubuntu 22.04/24.04, Debian 12 ya da RHEL 9 tabanlı (AlmaLinux, Rocky) bir sunucu
- root ya da sudo yetkisi
curl(Telegram için) vemsmtpveya çalışan birmailkomutu (e-posta için)- Sunucunun dışarıya 443 (Telegram) ve 587 (SMTP) portundan çıkabilmesi
Gerekli paketleri kurun:
# Debian / Ubuntu
sudo apt update
sudo apt install -y curl msmtp msmtp-mta ca-certificates
# RHEL 9 / AlmaLinux / Rocky (msmtp EPEL deposundadır)
sudo dnf install -y epel-release
sudo dnf install -y curl msmtp
Linux disk doluluk uyarısı betiğinin mantığı
Betik her çalıştığında şunları yapar:
df -P -lile yerel tüm bölümleri okur.-P(POSIX biçimi) uzun aygıt adlarının iki satıra bölünmesini engeller, böylece awk sütunları kaymaz.-lağ dosya sistemlerini (NFS, CIFS) atlar, yani askıda kalan bir NFS bağlantısı betiği kilitleyemez.tmpfs,devtmpfs,squashfs(snap paketleri),overlay(Docker katmanları) gibi zaten dolu görünen ya da izlenmesi anlamsız türleri-xile dışlar.- Aynı işi
df -P -iile inode için tekrarlar. Btrfs ve vfat gibi inode sayısı bildirmeyen sistemlerde yüzde yerine "-" gelir; betik sayısal olmayan değerleri atlar. - Eşiği aşan her bölüm için
/var/lib/disk-uyarialtında bir durum dosyası tutar. Dosya varsa yeni uyarı göndermez; yalnız belirlediğiniz süre geçtiyse hatırlatma yollar. - Doluluk eşiğin belirli bir payın altına inince (histerez) "düzeldi" mesajı gönderir ve durum dosyasını siler. Bu pay olmasa %84 ile %85 arasında gidip gelen bir disk her 15 dakikada iki mesaj üretirdi.
- Bildirim kanallarından en az biri başarılı olmadıkça durum dosyasını yazmaz. Telegram'a ulaşılamazsa bir sonraki çalışmada yeniden dener.
Telegram botu oluşturma ve chat_id bulma
Telegram'da @BotFather ile konuşun, /newbot komutunu verin, bota bir ad ve bot ile biten bir kullanıcı adı seçin. BotFather size bir token verir. Bu token bota tam erişim sağlar, parola gibi saklayın.
Sonra bota kendi hesabınızdan bir mesaj yazın (ya da botu uyarıların düşeceği gruba ekleyip grupta bir mesaj atın). Bot, kendisine yazılmadan size mesaj gönderemez. Ardından chat_id değerini bulun. Aşağıdaki komut token'ı ekrana yazdırmadan alır, böylece shell geçmişine düşmez. curl'ün --proto-default https seçeneği, adreste protokol belirtilmediğinde HTTPS kullanılmasını sağlar:
# Token'ı gizli olarak oku (ekranda görünmez, geçmişe yazılmaz)
read -rsp 'Bot token: ' TOKEN; echo
API="api.telegram.org"
# Bota gelen son mesajlardaki sohbet kimliklerini listele (yalnız HTTPS)
curl -s --proto-default https --proto '=https' "${API}/bot${TOKEN}/getUpdates" \
| grep -o '"chat":{"id":-\?[0-9]*' | sort -u
unset TOKEN
Kişisel sohbetlerde kimlik pozitif, gruplarda eksi işaretlidir. Liste boş geliyorsa bota henüz mesaj atmamışsınızdır. sendMessage ve getUpdates uç noktalarının tüm parametreleri Telegram'ın resmi Bot API belgesinde anlatılıyor.
E-posta bildirimi için msmtp ayarı
mail komutu tek başına çoğu sunucuda bir yere gitmez: yerel bir MTA yoksa ya da varsa ama dışarıya teslim edemiyorsa mesaj kaybolur. Daha güvenilir yol, kurumsal posta kutunuzun SMTP sunucusuna doğrudan bağlanan msmtp'dir. Sistem geneli ayar dosyası /etc/msmtprc olur. Betik root olarak çalışacağı için dosyayı yalnız root'un okuyabileceği biçimde oluşturun:
# /etc/msmtprc dosyasını yalnız root okuyabilecek şekilde oluştur
sudo install -m 600 -o root -g root /dev/null /etc/msmtprc
sudo tee /etc/msmtprc >/dev/null <<'EOF'
defaults
auth on
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
syslog on
account default
host smtp.example.com
port 587
from [email protected]
user [email protected]
password ORNEK_SMTP_PAROLASI
EOF
RHEL tabanlı sistemlerde sertifika dosyası /etc/pki/tls/certs/ca-bundle.crt yolundadır, tls_trust_file satırını buna göre değiştirin. SMTP ayarını betikten önce tek başına deneyin; çıkış kodu 0 değilse betik de gönderemez:
printf 'Subject: msmtp deneme\n\nmerhaba\n' | sudo msmtp [email protected]; echo "Çıkış kodu: $?"
Diğer seçenekler (port 465 için tls_starttls off, parola yerine passwordeval gibi) için sunucuda man msmtp sayfasına bakabilirsiniz. Kendi alan adınızla bir posta kutunuz yoksa uyarılar için kurumsal e-posta hesabı açıp SMTP bilgilerini buraya yazabilirsiniz.
Ayar dosyası: token ve eşikler
Token, chat_id ve eşikleri betiğin içine değil ayrı bir dosyaya koyuyoruz. Böylece betiği güncellerken sırlarınıza dokunmazsınız. Dosya 600 izniyle root'a aittir. ORNEK_ ile başlayan değerleri kendi bilgilerinizle değiştirin; kullanmadığınız kanalı boş bırakın.
# Ayar dosyasını yalnız root okuyabilecek şekilde oluştur
sudo install -m 600 -o root -g root /dev/null /etc/disk-uyari.conf
sudo tee /etc/disk-uyari.conf >/dev/null <<'EOF'
# Disk ve inode eşikleri (yüzde)
ESIK_YUZDE=85
INODE_ESIK=85
# Eşik üstünde kalan bölüm için kaç saatte bir hatırlatma gönderilsin
TEKRAR_SAAT=6
# "Düzeldi" mesajı için eşiğin kaç puan altına inilsin
HISTEREZ=5
# Mesajlarda görünecek sunucu adı
SUNUCU_ADI="ORNEK_SUNUCU_ADI"
# Telegram (kullanmayacaksanız boş bırakın)
TELEGRAM_TOKEN="ORNEK_BOT_TOKEN"
TELEGRAM_CHAT_ID="ORNEK_CHAT_ID"
# E-posta (kullanmayacaksanız boş bırakın)
EPOSTA_ALICI="[email protected]"
EPOSTA_GONDEREN="[email protected]"
EOF
Tam bash betiği
Aşağıdaki betik Ubuntu 22.04/24.04, Debian 12 ve RHEL 9 tabanlı dağıtımlar (bash 5) için hazırlandı. İdempotenttir: kaç kez çalıştırırsanız çalıştırın yalnız durum değiştiğinde mesaj gönderir. Telegram adresi (token dahil) curl'e komut satırı yerine standart girdiden verilir, böylece ps çıktısında görünmez. --proto '=https' ise isteğin yalnız şifreli bağlantıyla gitmesini garanti eder. --test parametresiyle yalnız deneme mesajı yollar.
Betiği /usr/local/sbin/disk-uyari.sh olarak kaydedin:
#!/usr/bin/env bash
# disk-uyari.sh: Yerel bölümlerde disk ve inode doluluğunu kontrol eder,
# eşik aşılınca Telegram ve/veya e-posta ile bildirim gönderir.
# Kullanım: disk-uyari.sh (normal kontrol)
# disk-uyari.sh --test (yalnız deneme mesajı)
set -uo pipefail
KONF="/etc/disk-uyari.conf"
DURUM_DIZINI="/var/lib/disk-uyari"
# Telegram Bot API sunucusu; protokol curl tarafında HTTPS'e sabitlenir
API="api.telegram.org"
# Varsayılan değerler; ayar dosyası bunları ezer
ESIK_YUZDE=85
INODE_ESIK=85
TEKRAR_SAAT=6
HISTEREZ=5
SUNUCU_ADI="$(hostname -f 2>/dev/null || hostname)"
TELEGRAM_TOKEN=""
TELEGRAM_CHAT_ID=""
EPOSTA_ALICI=""
EPOSTA_GONDEREN=""
HARIC_TIPLER="tmpfs devtmpfs squashfs overlay efivarfs iso9660 ramfs"
if [[ -r "$KONF" ]]; then
# shellcheck source=/dev/null
source "$KONF"
fi
log() { echo "disk-uyari: $*" >&2; }
telegram_gonder() {
local metin="$1" kod
[[ -n "$TELEGRAM_TOKEN" && -n "$TELEGRAM_CHAT_ID" ]] || return 2
# Adres (token dahil) curl'e stdin üzerinden verilir, ps çıktısında görünmez.
# parse_mode kullanılmaz; özel karakterler düz metin olarak gider.
kod=$(printf 'url = "%s/bot%s/sendMessage"\n' "$API" "$TELEGRAM_TOKEN" |
curl -sS -K - --proto-default https --proto '=https' --max-time 20 \
-o /dev/null -w '%{http_code}' \
--data-urlencode "chat_id=${TELEGRAM_CHAT_ID}" \
--data-urlencode "text=${metin}") || kod="000"
[[ "$kod" == "200" ]] && return 0
log "Telegram gönderimi başarısız (HTTP $kod)"
return 1
}
eposta_gonder() {
local konu="$1" metin="$2" kodlu_konu
[[ -n "$EPOSTA_ALICI" ]] || return 2
if command -v msmtp >/dev/null 2>&1; then
# Türkçe karakterli konu satırını RFC 2047 ile kodla
kodlu_konu="=?UTF-8?B?$(printf '%s' "$konu" | base64 -w0)?="
{
[[ -n "$EPOSTA_GONDEREN" ]] && printf 'From: %s\n' "$EPOSTA_GONDEREN"
printf 'To: %s\nSubject: %s\nMIME-Version: 1.0\n' "$EPOSTA_ALICI" "$kodlu_konu"
printf 'Content-Type: text/plain; charset=UTF-8\nContent-Transfer-Encoding: 8bit\n\n%s\n' "$metin"
} | msmtp -- "$EPOSTA_ALICI" && return 0
elif command -v mail >/dev/null 2>&1; then
printf '%s\n' "$metin" | mail -s "$konu" "$EPOSTA_ALICI" && return 0
else
log "msmtp ya da mail komutu bulunamadı"
return 1
fi
log "E-posta gönderimi başarısız"
return 1
}
# En az bir kanal başarılıysa 0 döner
bildir() {
local konu="$1" metin="$2" sonuc=1
telegram_gonder "${konu}"$'\n\n'"${metin}" && sonuc=0
eposta_gonder "$konu" "$metin" && sonuc=0
return $sonuc
}
# df çıktısını "yüzde<TAB>bağlama noktası" satırlarına çevirir.
# Ek parametre olarak -i verilirse inode kullanımını ölçer.
olcum() {
local haric=() t
for t in $HARIC_TIPLER; do haric+=(-x "$t"); done
df -P -l "$@" "${haric[@]}" 2>/dev/null | awk 'NR > 1 {
p = $5; sub(/%$/, "", p)
m = $6; for (i = 7; i <= NF; i++) m = m " " $i # boşluklu bağlama noktaları
if (p ~ /^[0-9]+$/) print p "\t" m
}'
}
mkdir -p "$DURUM_DIZINI"
chmod 700 "$DURUM_DIZINI"
if [[ "${1:-}" == "--test" ]]; then
if bildir "[TEST] $SUNUCU_ADI disk uyarısı" "Deneme mesajı: $(date '+%F %T')"; then
echo "Test mesajı en az bir kanaldan gönderildi."
exit 0
fi
echo "Test mesajı gönderilemedi, yukarıdaki hatalara bakın." >&2
exit 1
fi
uyarilar=(); duzelenler=(); yeni_durum=(); silinecek=()
denetle() {
local tur="$1" esik="$2"; shift 2
local yuzde baglama dosya
while IFS=$'\t' read -r yuzde baglama; do
# Her bölüm ve ölçüm türü için benzersiz durum dosyası
dosya="$DURUM_DIZINI/$(printf '%s:%s' "$tur" "$baglama" | md5sum | cut -d' ' -f1)"
if (( yuzde >= esik )); then
# İlk kez aşıldıysa ya da hatırlatma süresi geçtiyse uyar
if [[ ! -e "$dosya" ]] || [[ -n "$(find "$dosya" -mmin +"$((TEKRAR_SAAT * 60))" 2>/dev/null)" ]]; then
uyarilar+=("$baglama: $tur kullanımı %$yuzde (eşik %$esik)")
yeni_durum+=("$dosya")
fi
elif [[ -e "$dosya" ]] && (( yuzde < esik - HISTEREZ )); then
duzelenler+=("$baglama: $tur kullanımı %$yuzde")
silinecek+=("$dosya")
fi
done < <(olcum "$@")
}
denetle "disk" "$ESIK_YUZDE"
denetle "inode" "$INODE_ESIK" -i
if (( ${#uyarilar[@]} > 0 )); then
if bildir "[UYARI] $SUNUCU_ADI disk doluluğu" "$(printf '%s\n' "${uyarilar[@]}")"; then
for d in "${yeni_durum[@]}"; do touch -- "$d"; done
fi
fi
if (( ${#duzelenler[@]} > 0 )); then
if bildir "[DÜZELDİ] $SUNUCU_ADI disk doluluğu" "$(printf '%s\n' "${duzelenler[@]}")"; then
for d in "${silinecek[@]}"; do rm -f -- "$d"; done
fi
fi
exit 0
Betiği yerleştirip test mesajı gönderin:
# Betiği root'a ait, yalnız root çalıştırabilir şekilde kur
sudo install -m 750 -o root -g root disk-uyari.sh /usr/local/sbin/disk-uyari.sh
# Sözdizimi kontrolü ve deneme mesajı
bash -n /usr/local/sbin/disk-uyari.sh && sudo /usr/local/sbin/disk-uyari.sh --test
Betiği systemd timer ile 15 dakikada bir çalıştırma
systemd timer'ın cron'a göre iki avantajı var: çıktılar ve hatalar doğrudan journal'a düşer, Persistent=true sayesinde sunucu kapalıyken kaçırılan çalışma açılışta tamamlanır. Aşağıdaki birimler systemd kullanan güncel dağıtımlar için hazırlandı:
# Servis birimi: betiği tek seferlik ve düşük öncelikle çalıştırır
sudo tee /etc/systemd/system/disk-uyari.service >/dev/null <<'EOF'
[Unit]
Description=Disk ve inode doluluk kontrolü
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/disk-uyari.sh
Nice=10
IOSchedulingClass=idle
TimeoutStartSec=120
EOF
# Timer birimi: her saatin 0, 15, 30 ve 45. dakikasında tetikler
sudo tee /etc/systemd/system/disk-uyari.timer >/dev/null <<'EOF'
[Unit]
Description=Disk doluluk kontrolünü 15 dakikada bir çalıştır
[Timer]
OnCalendar=*:0/15
Persistent=true
RandomizedDelaySec=60
[Install]
WantedBy=timers.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now disk-uyari.timer
RandomizedDelaySec, çok sayıda sunucunuz varsa hepsinin aynı saniyede Telegram'a istek atmasını önler. OnCalendar ifadesinin nasıl yorumlandığını systemd-analyze calendar '*:0/15' komutuyla görebilir, sözdiziminin tamamını sunucudaki man systemd.timer sayfasında okuyabilirsiniz.
Cron alternatifi
systemd olmayan bir sistemde ya da cron'u tercih ediyorsanız tek satır yeterli:
echo '*/15 * * * * root /usr/local/sbin/disk-uyari.sh 2>&1 | logger -t disk-uyari' | sudo tee /etc/cron.d/disk-uyari >/dev/null
Timer ve cron'u birlikte etkinleştirmeyin. İkisi aynı durum dosyalarını kullandığı için zarar vermez ama gereksizdir.
Geri alma
Kurulumu tamamen kaldırmak için yalnız bu rehberin oluşturduğu dosyaları silin:
sudo systemctl disable --now disk-uyari.timer
sudo rm -f /etc/systemd/system/disk-uyari.service /etc/systemd/system/disk-uyari.timer
sudo rm -f /usr/local/sbin/disk-uyari.sh /etc/disk-uyari.conf /etc/cron.d/disk-uyari
sudo rm -rf /var/lib/disk-uyari
sudo systemctl daemon-reload
Doğrulama
Önce timer'ın planlandığını ve servisin hatasız çalıştığını görün:
systemctl list-timers disk-uyari.timer
sudo systemctl start disk-uyari.service
journalctl -u disk-uyari.service -n 20 --no-pager
Gerçek bir uyarıyı denemek için diski doldurmanız gerekmez. /etc/disk-uyari.conf içinde ESIK_YUZDE=1 yapıp servisi bir kez başlatın; tüm bölümler için uyarı gelmeli. Hemen tekrar başlattığınızda yeni mesaj gelmemeli, bu da tekrar engellemenin çalıştığını gösterir. Sonra değeri 85'e geri alıp servisi yeniden başlatın; bu kez "DÜZELDİ" mesajı gelmeli. Böylece üç yolu da birkaç dakikada sınamış olursunuz.
Uyarı geldiğinde ne yapmalı?
Önce yeri kaplayan dizini bulun. -x seçeneği taramayı aynı bölümde tutar, diğer disklere ve /proc gibi sanal sistemlere girmez:
# Kök bölümde en büyük dizinler
sudo du -xh --max-depth=1 / 2>/dev/null | sort -rh | head -n 15
# 500 MB'tan büyük dosyalar
sudo find / -xdev -type f -size +500M -printf '%s\t%p\n' 2>/dev/null | sort -rn | head -n 20 | numfmt --field=1 --to=iec
# Inode uyarısı geldiyse: en çok dosya içeren dizinler
sudo du --inodes -x --max-depth=2 / 2>/dev/null | sort -rn | head -n 15
# journal boyutunu gör ve 500 MB'a indir
journalctl --disk-usage
sudo journalctl --vacuum-size=500M
# Silinmiş ama hâlâ bir süreç tarafından açık tutulan dosyalar
sudo lsof +L1 2>/dev/null | head -n 20
Sık karşılaşılan suçlular şunlar: dönmeyen (rotate edilmeyen) uygulama günlükleri, MySQL binlog dosyaları, /var/cache/apt ya da dnf önbelleği, kullanılmayan Docker imajları (docker system df ile görün) ve aynı diskte biriken eski yedekler. Eski yedekleri bulmak için önce yalnız listeleyin, silmeden önce gözden geçirin:
# ORNEK_YEDEK_DIZINI altında 30 günden eski arşivleri listele (silmez)
sudo find /ORNEK_YEDEK_DIZINI -type f -name '*.tar.gz' -mtime +30 -printf '%TY-%Tm-%Td\t%s\t%p\n' | sort
Yedeklerin çalıştığı diskte durması zaten risklidir: disk arızalanırsa yedek de gider. Arşivleri S3 uyumlu nesne depolamaya taşımak hem yer açar hem de yedeği sunucudan ayırır.
lsof +L1 çıktısında büyük bir dosya görürseniz, df dolu derken du neden az gösteriyor sorusunun yanıtı budur: dosya silinmiş ama süreç onu açık tutuyor. İlgili servisi yeniden başlatınca alan geri gelir.
Temizlik yeterli değilse ve büyüme kalıcıysa disk büyütmek gerekir. LVM kullanan sunucularda adımlar için Linux sunucularda LVM disk genişletme rehberine bakabilirsiniz. Bulut sunucu kullanıyorsanız diski panelden büyütüp aynı adımlarla bölümü genişletebilirsiniz.
Sık yapılan hatalar
Özel karakterli mesajlar. Telegram'da parse_mode=Markdown açılırsa /var/lib/mysql_data gibi alt çizgili yollar biçim hatasına yol açar ve API 400 döner; mesaj hiç gelmez. Betik bu yüzden düz metin gönderir. & ya da + içeren metinler için de --data-urlencode kullanılır; metni adrese elle eklemek bu karakterleri bozar.
Yanlış awk sütunu. -P olmadan df, /dev/mapper/... gibi uzun aygıt adlarını iki satıra böler; yüzde bir sonraki satırın ilk sütununa kayar ve betik yanlış değeri okur. Bağlama noktasında boşluk varsa $6 yolun yalnız ilk parçasını verir. Betik altıncı sütundan sonrasını birleştirerek bunu çözer.
Sessizce başarısız olan mail. mail komutu, iletiyi yerel kuyruğa bıraktığında 0 döner ve teslim edilmese bile hata vermez. msmtp kullanın ve çıkış kodunu kontrol edin; hatalar journalctl -t msmtp ile görünür. Gönderen adresi SMTP hesabıyla uyuşmazsa birçok sağlayıcı iletiyi reddeder, bu yüzden EPOSTA_GONDEREN değerini msmtprc'deki from ile aynı yapın.
Protokolsüz adres ve eski curl. Betik Telegram adresini protokolsüz yazar ve HTTPS'i --proto-default https ile seçer. Bu seçenek çok eski curl sürümlerinde yoktur; curl --help all | grep proto-default boş dönüyorsa dağıtımın güncel curl paketini kurun.
Herkesin okuyabildiği token. Token'ı betiğe gömüp betiği bir Git deposuna koymak ya da 644 izinli bırakmak sık görülür. Ayar dosyası 600 izinli kalmalı.
Yalnız kök bölümü izlemek. /var ya da /home ayrı bölümse ve yalnız / kontrol ediliyorsa asıl dolan disk gözden kaçar. Betik tüm yerel bölümleri tarar.
Sık sorulan sorular
Eşik için %85 doğru bir değer mi?
Disk boyutuna ve büyüme hızına bağlıdır. 40 GB'lık bir diskte %85, yalnızca 6 GB kadar boş alan demektir ve bu bir gecelik veritabanı dökümüyle dolabilir. Küçük disklerde %80, birkaç terabaytlık disklerde %90 daha mantıklı olabilir. Önemli olan, uyarı geldikten sonra müdahale için size yeterli zaman bırakmasıdır.
Birden fazla sunucuda aynı botu kullanabilir miyim?
Evet. Token ve chat_id aynı kalabilir, her sunucuda SUNUCU_ADI farklı olsun. Uyarıları bir gruba yönlendirirseniz ekipteki herkes görür. Çok sayıda sunucuda RandomizedDelaySec değerini artırmak Telegram'ın hız sınırına takılmayı önler.
Root kullanıcısı disk %100 iken bile yazabiliyor mu?
ext4 varsayılan olarak blokların yaklaşık %5'ini root için ayırır; bu yüzden root çoğu zaman durum dosyasını yazabilir. XFS'te böyle bir ayrım yoktur. Durum dosyası yazılamazsa betik her çalışmada yeniden uyarır; bu durumda tekrar eden mesajlar sorunun ciddi olduğunun işaretidir.
Bu betik bir izleme sistemi yerine geçer mi?
Tek ya da birkaç sunucu için disk izleme işini görür. CPU, bellek, servis durumu ve geçmiş grafikleri gerekiyorsa Zabbix, Prometheus ya da Netdata gibi bir izleme sistemi daha uygundur. Bu betik o sistemler çalışmadığında da haber veren hafif bir yedek olarak yanlarında kalabilir.
Sonuç
Kurulum dört parçadan oluşuyor: yalnız root'un okuyabildiği ayar dosyası, disk ve inode doluluğunu ölçen bash betiği, Telegram ya da msmtp ile bildirim ve 15 dakikada bir çalışan systemd timer. Tekrar engelleme ve "düzeldi" mesajı sayesinde uyarılar gürültüye dönüşmez. Uyarı geldiğinde du, find ve journalctl --vacuum ile yer açabilirsiniz. Büyüme kalıcıysa diski büyütmeyi önceden planlayın.
- #disk doluluk
- #bash betiği
- #systemd timer
- #telegram bot
- #msmtp
- #inode
- #sunucu izleme

