Sistem Yöneticileri İçin Bash Scripting İpuçları: Verimliliği Artırın
Bash scripting, sistem yöneticilerinin tekrarlayan görevleri otomatikleştirmesi, sistem yönetimini kolaylaştırması ve operasyonel verimliliği artırması için kritik bir araçtır. Bu rehber, production ortamlarında kullanabileceğiniz derinlemesine teknik ipuçları ve gerçek dünya senaryoları sunarak Bash scripting yeteneklerinizi geliştirmeyi amaçlar.
1. Hata Ayıklama ve Güvenlik İçin `set -euo pipefail`
Bash scriptlerinizin güvenilirliğini artırmak ve beklenmedik hataları önlemek için scriptin en başında set -euo pipefail komutunu kullanmak standart bir pratiktir. Bu komutlar:
-e(errexit): Bir komut sıfır olmayan bir çıkış koduyla biterse, script hemen sonlanır. Bu, bir komutun başarısız olması durumunda scriptin devam etmesini engeller.-u(nounset): Tanımlanmamış bir değişkene erişmeye çalıştığınızda script hata verir ve sonlanır. Bu, yazım hatalarından kaynaklanan sorunları erken tespit etmenize yardımcı olur.-o pipefail: Bir pipe hattındaki (örneğincommand1 | command2) herhangi bir komut başarısız olursa, tüm pipe hattının çıkış kodu o başarısız komutun çıkış kodu olur. Bu, özellikle pipe hattındaki ara komutların başarısızlıklarını gözden kaçırmamanızı sağlar.
#!/bin/bash
set -euo pipefail
# Scriptiniz buraya gelecek
ls /var/log/nonexistent_file
# Bu satır -e seçeneği nedeniyle scripti durduracaktır.
2. Verimli Log Analizi İçin `grep`, `awk` ve `sed` Kombinasyonu
Log dosyalarını analiz etmek, sistem sorunlarını teşhis etmenin temelidir. Bash araçları bu süreci oldukça verimli hale getirebilir.
Senaryo: Belirli Bir Hata Kodunu İçeren Satırları Filtreleme ve İşleme
Örneğin, Apache erişim loglarında (access.log) belirli bir IP adresinden gelen 404 Not Found hatalarını saymak isteyebilirsiniz.
#!/bin/bash
set -euo pipefail
LOG_FILE="/var/log/apache2/access.log"
TARGET_IP="192.168.1.100"
ERROR_CODE="404"
if [ ! -f "$LOG_FILE" ]; then
echo "Hata: Log dosyası bulunamadı: $LOG_FILE" >&2
exit 1
fi
# grep ile IP'yi ve hata kodunu filtrele, awk ile sayacı artır
count=$(grep "$TARGET_IP" "$LOG_FILE" | grep "$ERROR_CODE" | wc -l)
if [ "$count" -gt 0 ]; then
echo "IP $TARGET_IP için $ERROR_CODE hataları bulundu: $count adet."
else
echo "IP $TARGET_IP için $ERROR_CODE hatası bulunamadı."
fi
# Daha karmaşık analiz için awk kullanımı:
# Bu örnek, belirli bir zaman aralığındaki 5xx hatalarını listeler.
sed -n '/2023\/10\/27:10:/,/2023\/10\/27:11:/ p' "$LOG_FILE" | grep -E '" [5][0-9]{2} ' | awk '{print $1, $4, $7}'
grep -E ile genişletilmiş regex desteği sağlar. awk, sütun bazında veri işleme için güçlüdür. sed, belirli satır aralıklarını veya desenleri çıkarmak için kullanılabilir.
3. Veri Yedekleme ve Sıkıştırma Otomasyonu
Önemli sistem dosyalarını veya veritabanlarını düzenli olarak yedeklemek, veri kaybını önlemek için hayati önem taşır. Bash scripting bu süreci otomatikleştirmek için idealdir.
Senaryo: MySQL Veritabanı Yedekleme ve Sıkıştırma
Bu script, belirli bir MySQL veritabanını yedekler, sıkıştırır ve eski yedekleri temizler.
#!/bin/bash
set -euo pipefail
DB_USER="db_user"
DB_PASS="your_db_password"
DB_NAME="mydatabase"
BACKUP_DIR="/opt/backups/mysql"
DATE_FORMAT=$(date +"%Y-%m-%d_%H-%M-%S")
BACKUP_FILE="${DB_NAME}_${DATE_FORMAT}.sql.gz"
# Gerekli dizini oluştur
mkdir -p "$BACKUP_DIR"
echo "MySQL veritabanı '$DB_NAME' yedekleniyor..."
# mysqldump ile veritabanını al, gzip ile sıkıştır
mysqldump -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" | gzip > "$BACKUP_DIR/$BACKUP_FILE"
if [ $? -eq 0 ]; then
echo "Yedekleme başarıyla tamamlandı: $BACKUP_DIR/$BACKUP_FILE"
else
echo "Hata: Yedekleme başarısız oldu." >&2
exit 1
fi
# Eski yedekleri temizle (örneğin, 7 günden eski olanları sil)
find "$BACKUP_DIR" -name "*.sql.gz" -type f -mtime +7 -delete
echo "Eski yedekler temizlendi."
Bu script, veritabanı bağlantı bilgilerini doğrudan kod içine yerleştirmek yerine, bir konfigürasyon dosyasından veya ortam değişkenlerinden okumak gibi daha güvenli yöntemlerle geliştirilebilir.
4. Sistem Sağlık Kontrolü ve Uyarı Scriptleri
Sunucuların performansını ve sağlığını sürekli izlemek, potansiyel sorunları büyümeden tespit etmek için kritiktir. Bash, basit sağlık kontrol scriptleri yazmak için kullanılabilir.
Senaryo: Disk Kullanımı ve Bellek Kullanımı Kontrolü
Bu script, disk kullanımının belirli bir eşiği aşması veya bellek kullanımının yüksek olması durumunda uyarı gönderir.
#!/bin/bash
set -euo pipefail
DISK_THRESHOLD=90 # Disk kullanım yüzdesi
MEMORY_THRESHOLD=85 # Bellek kullanım yüzdesi
ALERT_EMAIL="admin@example.com"
# Disk Kullanımı Kontrolü
USAGE=$(df -hP | awk 'NR==2 {gsub(/%/,""); print $5}')
if [ "$USAGE" -gt "$DISK_THRESHOLD" ]; then
echo "Uyarı: Disk kullanımı kritik seviyede ($USAGE%)."
# Send email alert using mail command or external service
echo "Disk usage critical on $(hostname): $USAGE%" | mail -s "Disk Usage Alert" "$ALERT_EMAIL"
fi
# Bellek Kullanımı Kontrolü (Free komutu ile)
# Toplam bellek, kullanılan bellek, boş bellek, paylaşılan bellek, buffer/cache
# Biz kullanılan (kullanılan + buffer/cache) bellek yüzdesini hesaplayacağız.
MEM_INFO=$(free -m | awk '/Mem:/ {print $2" "$3}')
TOTAL_MEM=$(echo $MEM_INFO | awk '{print $1}')
USED_MEM=$(echo $MEM_INFO | awk '{print $2}')
MEMORY_USAGE_PERCENT=$(awk -v used="$USED_MEM" -v total="$TOTAL_MEM" 'BEGIN { printf "%.0f\n", (used/total)*100 }')
if [ "$MEMORY_USAGE_PERCENT" -gt "$MEMORY_THRESHOLD" ]; then
echo "Uyarı: Bellek kullanımı yüksek ($MEMORY_USAGE_PERCENT%)."
echo "Memory usage high on $(hostname): $MEMORY_USAGE_PERCENT%" | mail -s "Memory Usage Alert" "$ALERT_EMAIL"
fi
echo "Sistem sağlığı kontrol edildi."
Bu scriptler, cron job'lar aracılığıyla düzenli aralıklarla çalıştırılarak proaktif sistem yönetimi sağlanabilir.
5. Dosya ve Dizin Yönetimi İçin `find` Komutunun Güçlü Kullanımı
find komutu, dosya sisteminde arama yapmak ve bulunan dosyalar üzerinde işlem yapmak için son derece esnektir.
Senaryo: Belirli Bir Boyuttan Büyük Dosyaları Bulma ve İşlem Yapma
/data dizininde 1 GB'tan büyük dosyaları bulup listelemek ve ardından silmek (dikkatli kullanılmalı!).
#!/bin/bash
set -euo pipefail
SEARCH_DIR="/data"
SIZE_LIMIT="1G"
echo "$SEARCH_DIR altında $SIZE_LIMIT boyutundan büyük dosyalar aranıyor..."
# Boyuttan büyük dosyaları bul ve listele
find "$SEARCH_DIR" -type f -size +"$SIZE_LIMIT" -print -exec ls -lh {} \;
# DİKKAT: Aşağıdaki komut bulunan dosyaları SİLER.
# Gerçek bir senaryoda kullanmadan önce test edilmelidir.
# find "$SEARCH_DIR" -type f -size +"$SIZE_LIMIT" -delete
echo "Arama tamamlandı."
-type f sadece dosyaları arar. -size +1G 1 Gigabyte'tan büyük dosyaları belirtir. -exec seçeneği, bulunan her dosya üzerinde komut çalıştırmayı sağlar.
Sonuç
Bash scripting, sistem yöneticileri için vazgeçilmez bir beceridir. Bu ipuçları ve senaryolar, tekrarlayan görevleri otomatikleştirmek, sistem güvenliğini artırmak ve operasyonel verimliliği en üst düzeye çıkarmak için bir başlangıç noktası sunmaktadır. Scriptlerinizi üretim ortamlarında kullanmadan önce dikkatlice test ettiğinizden emin olun.