Giriş

Eğer bir Ubuntu VPS üzerinde bir cron job ayarladıysanız, muhtemelen sizi düşündüren bazı sorunlar ile karşılaşmışsınızdır. Yaygın bir sorun, cron job’ın bir script’i çalıştırmaya çalışırken başarılı olmaması, bu da sıfır baytlık çıktı dosyalarına veya eksik işlemlere neden olur. Bu blog yazısında, bir Ruby script’inin bir cron job aracılığıyla MySQL veritabanını yedeklemediği gerçek bir senaryoyu inceliyoruz; bu durum kullanıcıların komutun komut satırında mükemmel çalışmasına rağmen neden planlandığında çalışmadığı konusunda kafalarını karıştırıyor.

Sorunun Anlaşılması

Tartışılan durumda, cron job, aşağıdaki görevleri yerine getiren bir Ruby script’ini çalıştırmak üzere ayarlanmıştı:

  1. MySQL Veritabanı Yedeklemesi: database.yml‘de belirtilen veritabanını yedeklemek için mysqldump kullanır.
  2. Dosya Sıkıştırma: Yedekleme dosyası, alan tasarrufu sağlamak için gzip ile sıkıştırılır.
  3. Dosya Transferi: Sıkıştırılmış dosya, SFTP kullanılarak uzak bir sunucuya gönderilir.

Script doğrudan komut satırından çalıştırıldığında iyi performans gösterirken, cron job boş bir dosya oluşturuyordu. Aşağıda soruna neden olan cron job komutunun basitleştirilmiş bir sürümü bulunmaktadır.

PATH=/usr/bin
10 3 * * * ruby /home/deploy/bin/datadump.rb

Bu Neden Oluyor?

Sorunun temelinde cron job’ın çalıştığı ortam yatıyor. Bir script veya komut cron aracılığıyla çalıştığında, bu genellikle kullanıcının terminal oturumunu her zaman taklit etmeyen kısıtlı bir ortamda gerçekleşir. Bu, özellikle aşağıdaki durumlarda beklenmedik davranışlara yol açabilir:

  • Çalışma Dizinleri: Cron job’lar, beklenen çalışma dizininde çalışmayabilir.
  • Ortam Değişkenleri: Bir script cron ile çalıştırıldığında bazı ortam değişkenleri mevcut olmayabilir.

Çözüm

Adım 1: Çalışma Dizini Kontrolü

Cron job çalıştığında, tipik kullanıcı ortamınızın bağlamında çalışmaz. Genellikle, aynı ana dizine veya çalışma dizinine sahip olmayabilir. Script’inizin aynı şekilde çalışmasını sağlamak için çalışma dizinini açıkça tanımlamak en iyi yoldur.

Çalışma Dizinini Belirtme Yöntemi:

  1. Cron job’ınızın başında cd komutunu kullanabilirsiniz:
10 3 * * * cd /home/deploy/bin && ruby datadump.rb

Adım 2: Kesin Yollar Kullanın

Diğer bir sorun, script’inizin dosyaları göreceli yollar kullanarak oluşturmasıdır. Cron job’ın yürütme ortamı, varsayılan dizinlerde dosya oluşturma için gerekli izinlere sahip olmayabilir. Bunu çözmek için:

  • Script’iniz içindeki dosya işlemleri için relatif yollar yerine kesin yollar kullanın.

Örneğin, dosya oluşturmayı gözden geçirin:

dump       = "/home/deploy/backups/myapp-#{Time.now.strftime(TIMESTAMP)}.sql.gz"

Adım 3: Doğru İzinleri Ayarlama

Cron job’ı çalıştıran kullanıcının (bu durumda deploy) aşağıdaki için gerekli izinlere sahip olduğunu doğrulayın:

  • Yedekleme dosyalarının oluşturulduğu çıktı dizini.
  • Script’in etkileşimde bulunduğu diğer dosyalar veya dizinlere erişim.

Adım 4: Hata Ayıklama İçin Çıktıyı Kaydetme

Script’lerinizde kayıt tutma kullanmak, cron job çalıştığında ne olduğunu anlamanıza yardımcı olabilir. Aşağıdakileri kaydettiğinizden emin olun:

  • Görevlerin başlangıcını ve tamamlanmasını belirten mesajlar.
  • Yürütme sırasında karşılaşılan hatalar.

Ayrıca standart çıktıyı ve hatayı bir günlük dosyasına yönlendirebilirsiniz:

10 3 * * * ruby /home/deploy/bin/datadump.rb >> /home/deploy/log/cron.log 2>&1

Adım 5: Ortam Değişkenleri

Son olarak, gereken ortam değişkenlerinin doğru şekilde ayarlandığından emin olun. Cron job, kabuğunuzdan tüm değişkenleri devralmayacaktır, bu da script’in yürütülmesinde başarısızlıklara neden olabilir.

Sonuç

Çalışma dizinini kontrol ederek, kesin yollar kullanarak, doğru izinleri sağlamak, hata ayıklamayı kolaylaştırmak için çıktıları kaydederek ve ortam değişkenlerini gözden geçirerek, çalışmayan cron job’lar ile ilgili sorunları etkili bir şekilde çözebilirsiniz.

Cron job’larla ilgili teknik sorunlarla karşılaşmak can sıkıcı olabilir, ancak sisteminizdeki planlı görevlerin güvenilirliğini geri kazanmak için sistematik bir sorun giderme ile bunu yapabilirsiniz.