Bulut Günlüğü (AWS)

Sistem Yöneticileri İçin Bash Scripting İpuçları: Verimliliği Artırın

 · 

Sistem Yöneticileri İçin Bash Scripting İpuçları: Verimliliği Artırın

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ğin command1 | 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.

← Blog Listesine Dön