0Pricing
Linux Server Deployment & SSH Mastery · Ders

Betiklerde Hata İşleme ve Günlükleme

Güçlü hata işleme uygulayın, betik çıktısını yönlendirin ve betik yürütmesini izlemek ve sorunları gidermek için anlamlı günlükler oluşturun.

Betiklerde Hata İşleme ve Günlükleme, CoddyKit'te ücretsiz bir Linux Server Deployment & SSH Mastery dersidir. Bu, 4 dersinin 3. 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, Linux Server Deployment & SSH Mastery öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Linux Server Deployment & SSH Mastery kursu toplamda 4 dersten oluşur.

Betiklerinizi Güvenilir Hâle Getirin

Önemli işler yapan betiğinizin bir sunucuda çalıştığını düşünün. Bir şeyler ters giderse ne olur?

  • Sessizce başarısız mı olur?
  • Ardında düzensizlik mi bırakır?
  • Ne zaman ve neden başarısız olduğunu anlayabilir misiniz?

Sağlam betikler hataları düzgün bir şekilde ele alır ve anlaşılır günlükler sağlar. Bu derste bunu nasıl yapacağınızı öğreneceksiniz!

Çıkış Kodlarını Anlama

Linux'taki her komut ve betik, tamamlandığında bir çıkış kodu (veya çıkış durumu) döndürür. Bu sayı, işlemin başarılı mı yoksa başarısız mı olduğunu gösterir.

  • 0: Başarı anlamına gelir! Her şey yolunda gitmiştir.
  • 1-255: Başarısızlık anlamına gelir. Belirli bir sayı, hata türünü gösterebilir.

Bunu uygulamalı olarak görelim:

#!/bin/bash
# This script demonstrates exit codes

echo "Attempting a successful command..."
ls /tmp
echo "Exit code for 'ls /tmp': $?"

echo

echo "Attempting a failing command..."
ls /nonexistent_directory
echo "Exit code for 'ls /nonexistent_directory': $?"

Komut Durumunu Denetleme

Herhangi bir komut çalıştıktan sonra, özel $? değişkenini kullanarak çıkış kodunu denetleyebilirsiniz. Bu, betiğinizde karar vermek için çok kullanışlıdır.

Başarıya veya başarısızlığa tepki vermek için bir if deyimi kullanabilirsiniz:

#!/bin/bash
# Check if a file exists before trying to read it

FILENAME="test_file.txt"
touch $FILENAME # Create it for success case

if [ -f "$FILENAME" ]; then
  echo "File '$FILENAME' exists. Processing..."
  # ... do something with the file ...
  rm $FILENAME # Clean up
else
  echo "Error: File '$FILENAME' not found!"
  exit 1
fi

echo "Script finished."

`set -e`: Hata Durumunda Çıkış

Basit betiklerde, her yerde $? değerini el ile denetlemek yorucu olabilir. set -e komutu, betiğinizin davranışını değiştirir:

  • Herhangi bir komut sıfır olmayan bir durumla sonlanırsa (başarısız olursa) betik hemen sonlandırılır.
  • Bu, betiğinizin bozulmuş verilerle veya geçersiz bir durumla çalışmayı sürdürmesini önler.

Bu betiği çalıştırmayı deneyin. cp komutu başarısız olursa ne olur?

#!/bin/bash
set -e

echo "Starting important operations..."
mkdir my_temp_dir
cp /nonexistent_source my_temp_dir/target # This will fail

echo "This line will not be reached if cp fails."
rmdir my_temp_dir
echo "Script finished successfully."

Temizleme İçin `trap`

Bazen bir betik başarısız olsa bile geçici dosyaları kaldırmak gibi temizleme işlemleri yapmanız gerekir. trap komutu, sinyalleri (çıkış veya hata gibi) yakalamanıza ve bir komut çalıştırmanıza olanak tanır.

  • EXIT: Başarılı veya başarısız olmasından bağımsız olarak, betik sonlandığında çalışır.
  • ERR: Bir komut sıfır olmayan bir durumla sonlandığında çalışır (set -e etkinse).

Burada, geçici bir dizinin her zaman kaldırılmasını sağlıyoruz:

#!/bin/bash

TEMP_DIR="/tmp/my_script_temp_$(date +%s)"

function cleanup {
  echo "Cleaning up temporary directory: $TEMP_DIR"
  rm -rf "$TEMP_DIR"
}

trap cleanup EXIT

mkdir "$TEMP_DIR"
echo "Working in $TEMP_DIR..."
# Simulate some work, maybe it fails
# cp /nonexistent_file "$TEMP_DIR/" # Uncomment to test failure

echo "Script completed."

Çıktıyı Yeniden Yönlendirme

Betiğiniz çalışırken sık sık iletiler yazdırır. Bunlar iki ana türe ayrılır:

  • Standart Çıktı (stdout): Normal iletiler (dosya tanımlayıcısı 1).
  • Standart Hata (stderr): Hata iletileri (dosya tanımlayıcısı 2).

Bu akışları ekran yerine dosyalara yeniden yönlendirebilirsiniz:

  • command > file: stdout'u file dosyasına yeniden yönlendirir.
  • command 2> file: stderr'i file dosyasına yeniden yönlendirir.

Başarı ve hata iletilerini ayrı ayrı kaydedelim.

#!/bin/bash
# Redirect stdout to success.log and stderr to error.log

echo "This is a success message." > success.log
ls /nonexistent_path 2> error.log

echo "Check success.log and error.log files."
# To view them after running:
# cat success.log
# cat error.log

Tüm Çıktıyı Tek Dosyaya Yönlendirme

Hem standart çıktının hem de standart hatanın, daha kolay incelenebilmesi için tek bir günlük dosyasında bulunması çoğu zaman yararlıdır. Bunu yapmanın birkaç yolu vardır:

  • command > file 2>&1: stdout'u file dosyasına, ardından stderr'i stdout'un yönlendirildiği yere (dosyaya) yönlendirir.
  • command &> file: Aynı işlem için daha kısa ve daha modern söz dizimidir.

Bu yöntem, betiğinizin yürütülme sürecine ilişkin kapsamlı bir günlük oluşturmak için harikadır.

#!/bin/bash
# Redirect both stdout and stderr to a single log file

LOG_FILE="combined_script.log"

echo "Starting script..." &> "$LOG_FILE"
echo "This message goes to stdout." &>> "$LOG_FILE"
ls /nonexistent_dir 2>&1 | tee -a "$LOG_FILE"
echo "Script finished." &>> "$LOG_FILE"

echo "Check the '$LOG_FILE' file for all output."

Günlüklerinize Zaman Damgası Ekleyin

Hata ayıklarken bir olayın ne zaman gerçekleştiğini bilmek kritik önem taşır. Günlük iletilerinize zaman damgası eklemek, bu iletileri çok daha kullanışlı hâle getirir.

date komutunu kullanarak geçerli tarih ve saati her günlük girdisinin başına ekleyebilirsiniz. Bu, olayları kronolojik sırayla izlemenize yardımcı olur.

#!/bin/bash

LOG_FILE="timestamped_script.log"

function log_message {
  echo "$(date +%Y-%m-%d_%H:%M:%S) - $1" &>> "$LOG_FILE"
}

log_message "Script started."
sleep 1
log_message "Performing task A..."
# Simulate an error
ls /no_such_place || log_message "Error: Command failed."
sleep 1
log_message "Script finished."

echo "Check '$LOG_FILE' for timestamped entries."

`logger` ile Sistem Günlüklerine Gönderme

Önemli olaylar için iletileri doğrudan sistemin günlükleme olanağına (syslog) göndermek isteyebilirsiniz. logger komutu tam olarak bunu yapar.

  • Sistem günlükleri genellikle journalctl gibi araçlar tarafından yönetilir (systemd kullanan sistemlerde).
  • Bu, betiğinizin önemli iletilerini diğer sistem olaylarıyla merkezî bir yerde toplar.
  • Kritik hatalar veya denetim izleri için kullanışlıdır.

logger ile gönderilen iletileri, sisteminize bağlı olarak journalctl -f veya tail -f /var/log/syslog kullanarak bulabilirsiniz.

#!/bin/bash
# Send a message to system logs

SCRIPT_NAME="MyBackupScript"

logger -t "$SCRIPT_NAME" "Starting daily backup operation."

# Simulate a task
sleep 2
if [ $(($RANDOM % 2)) -eq 0 ]; then
  logger -t "$SCRIPT_NAME" -p user.info "Backup successful."
else
  logger -t "$SCRIPT_NAME" -p user.err "Backup failed: Disk full."
fi

echo "Messages sent to system logs. Check with 'journalctl -t $SCRIPT_NAME'."

Hata İşleme Denetimi

Bazı dosyaları işlemek için bir Bash betiği yazdınız. İçindeki herhangi bir komut başarısız olursa betiğin hemen sonlanmasını ve betik nasıl sonlanırsa sonlansın geçici bir dizinin temizlenmesini sağlamak istiyorsunuz.

Bunu gerçekleştirmek için öncelikle hangi iki Bash komutunu kullanırsınız?

Özet ve Sonraki Adımlar

Bash betiklerinizi daha sağlam ve hata ayıklaması daha kolay hâle getirmeyi öğrendiniz!

  • Çıkış Kodları: Komutların başarılı veya başarısız olduğunu anlama.
  • set -e: Hata durumunda otomatik olarak çıkma.
  • trap: Betik sonlandığında temizleme işlemleri gerçekleştirme.
  • Çıktı Yönlendirme: stdout ve stderr'nin nereye gönderileceğini denetleme.
  • Zaman Damgaları: Günlüklerinize bağlam ekleme.
  • logger: Sistem genelindeki günlükleme özelliğiyle bütünleşme.

Bu teknikleri uygulayarak otomatikleştirilmiş görevlerinizi daha güvenilir ve yönetilebilir hâle getirebilirsiniz. Gerçekten dayanıklı otomasyonlar geliştirmek için pratik yapmayı sürdürün!

Sıkça Sorulan Sorular

“Betiklerde Hata İşleme ve Günlükleme” dersi ücretsiz mi?

Evet — “Betiklerde Hata İşleme ve Günlükleme” 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 Linux Server Deployment & SSH Mastery kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Linux Server Deployment & SSH Mastery kursu toplamda 4 dersten oluşur.

“Betiklerde Hata İşleme ve Günlükleme” dersinde ne öğreneceğim?

Güçlü hata işleme uygulayın, betik çıktısını yönlendirin ve betik yürütmesini izlemek ve sorunları gidermek için anlamlı günlükler oluşturun. Linux Server Deployment & SSH Mastery 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.

Linux Server Deployment & SSH Mastery öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Linux Server Deployment & SSH Mastery, 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 3. dersidir.

“Betiklerde Hata İşleme ve Günlükleme” 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 Linux Server Deployment & SSH Mastery dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Linux Server Deployment & SSH Mastery 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. Bash Betik Yazımına Giriş
  2. Sunucu Görevlerini Otomatikleştirme
  3. Betiklerde Hata İşleme ve Günlükleme
  4. İşlevler, Bağımsız Değişkenler ve Yeniden Kullanılabilir Betikler
← Linux Server Deployment & SSH Mastery Sayfasına Dön