Cron ile Görevleri Zamanlamak

Cron, Linux üzerinde zamanlanmış görevleri kontrol etmek için kullanılan bir araçtır. Komutların, programların ve script’lerin belirli zaman aralıklarıyla çalışmalarını sağlamak için kullanılır. Kullanıcının ev dizinini, belgelerini veya masaüstünü her gece güvenli bir konuma yedeklemek veya Raspberry Pi’ın CPU yük istatistiğini 5 dk.’da bir log dosyasına kaydetmek gibi rutin işler için faydalıdır. Benzer şekilde; Raspberry Pi bilgisayarının yazılım güncelleştirmelerini otomatik olarak uygulamak için de kullanılabilir.

cron arka planda bir servis olarak çalışır ve tüm kullanıcıların kendi cron tablosundaki (crontab/cron table) görevleri her dakika tarayarak yerine getirir. cron bu görevleri en az 1’er dakika aralıklar ile zamanlayabilir. cron’un çalıştırması için yeni bir görev tanımlamak gerektiğinde crontab aracı düzenleme (edit) kipinde çalıştırılarak tanımlama yapılır. Bunun için aşağıdaki komutu kullanabilirsiniz:

crontab’a ilk defa giriş yaptığınızda, düzenlemeyi hangi metin editörü ile yapmak istediğinizi sorar. Favori editörünüzü seçtikten sonra geçerli kullanıcının cron tablosu, düzenleme yapılabilmesi için editör içinde görüntülenir (bir metin dosyasıdır).

Mevcut bir kullanıcının cron tablosunu görüntülemek için –u ve –l seçenekleri kullanılır. Örneğin pi kullanıcısının zamanlanmış görevlerini listelemek için aşağıdaki gibi bir komut çalıştırılabilir:

Her Kullanıcın Kendi cron Tablosu Vardır

Cron her kullanıcı için ayrı bir cron tablosu tutar. Örneğin root (sudo) kullanıcısına geçiş yaptığınızda; crontab –e komutu ile bu kullanıcıya ait cron tablosunu (/var/spool/cron/crontabs/root) düzenlemiş olursunuz. Dilerseniz bu dosyanın içeriğini cat aracı ile de görüntüleyebilirsiniz.

cat /var/spool/cron/crontabs/root

Cron tablosunun her bir satırı bir görevi zamanlamak için kullanılır. İlgili satıra öncelikle zamanlama bilgisi, ardından da çalıştırılacak olan komut veya programın yolu yazılır. Zamanlama bilgisini tanımlamak için kullanılan biçim aşağıdaki gibidir:

Örnek vermek gerekirse, her gün saat 01:00’da/tmp  dizinini temizlemek istiyorsak aşağıdaki gibi bir cron satırı yazmalıyız:

Yukarıdaki örnekte, zamanlama bilgisinin tanımlandığı kısımda kullanılan * karakteri ile tüm aylar ve günler seçilmiştir. Dolayısıyla her gün 01:00’datmp dizini boşaltılacaktır. Bu yazım şeklindeki en önemli kural, zamanlamayı belirten ifadeler arasına boşluk yazılması gerektiğidir. Zamanlama bilgisi için toplam da 4 adet boşluk kullanılmalıdır. Satırın sonunda kullanılan * karakterinin zaman belirteci ile ilgisi yoktur, sadece/tmp dizinindeki tüm dosyaları belirtmek için kullanılmıştır.

Crontab’da oldukça esnek kullanımlar söz konusudur. Örneğin aynı işlemin saat 01’de 15. ve 45. dakikalarda yapılmasını istiyorsanız şunu yazabilirsiniz:

Aynı işlemin saat 1’de 5 dakika da bir yapılmasını istiyorsanız şunu yazabilirsiniz:

aynı işlemin 12 saatte bir yapılması için:

Günde bir kez yapılması için:

Her ayın 20., 21., 22., 23., 24. ve 25. günlerinde saat 01:00’da bir kez yapılmasını isterseniz:

Hafta içi her gün 9 ile 18 saatleri arasında yapılması için:

Daha önce, cron tablosunda tanımlayabileceğiniz en küçük zamanlama aralığının 1 dakika olduğunu belirtmiştim. /tmp dizininin temizleme işleminin dakikada bir çalıştırılması için şunu yazabilirsiniz:

Görüldüğü gibi zamanlama bilgisi tanımlanırken *, – ve / karakterleri esnek tanımlamalar yapabilmemize imkân tanıyor. Zamanlama bilgisinin ardından bir boşluk bırakmayı unutmayın. Dilerseniz cron tablosunda şu anahtar kelimeleri de kullanabilirsiniz:

Bu anahtar kelimelerin kullanımına örnek vermek gerekirse; /tmp dizininin her saat başı temizlenmesini isterseniz, cron tablosuna şu satırı ekleyebilirsiniz:

cron bir görevi her gerçekleştirdiğinde kullanıcıya bir e-posta gönderir. Çok sık çalıştırılan görevlerde posta kutusunun dolması veya zamanla disk alanının azalması mümkündür. E-posta gönderilmemesi için her cron satırının sonuna şu ifadeyi yazabilirsiniz: >/dev/null 2>&1

Örneğin:

cron’un yaptığı her işlemin çıktısını bir günlük dosyasına kaydetmek isterseniz çıktıyı /home/pi/temizlik_kaydi.log gibi bir dosyaya aşağıdaki gibi yönlendirebilirsiniz.

Bir kullanıcın cron tablosunu tamamen silmek için –ri seçeneğinden faydalanabilirsiniz:

cron görevlerini zamanlamak için crontab-generator.org adresinde güzel bir çevrim içi üreteç yer alıyor. Üretecin ürettiği cron görevini doğrudan crontab tablonuza yapıştırabilirsiniz.

cron tabloları Raspberry Pi OS işletim sisteminde /var/spool/cron/crontabs/ dizini altında kullanıcı adındaki bir metin dosyasına saklanır (örn.:/var/spool/cron/crontabs/pi).

Grafik ortamda görevleri zamanlamak

cron dosyasını grafik ortamda düzenlemek için gnome-schedule aracını kullanabilirsiniz. Aracı yüklemek için aşağıdaki komutu kullanın. Aracın menü kısa yolu ana menüye eklenir.

Gnome-schedule programının ekran görüntüsü

Grafik ortamda gnome-schedule programını kullanarak yeni zamanlanmış görevler ekleyebilirsiniz. Ayrıca hazır şablonlar (template) oluşturarak yeni görevleri kolayca tanımlayabilirsiniz. Gnome-schedule tek seferlik görevleri de tanımlayabilir. Bunun anlamı belli bir zamanda sadece bir kez çalıştırılacak görevlerdir. Bu görevler tekrarlanmaz. Gnome-schedule tek seferlik görevleri at programını kullanarak zamanı geldiğinde çalıştırır ve ardından listeden kaldırır.

Zamanlamış görevlerde hata ayıklamak

cron, crontab dosyasındaki girdileri çalıştırırken varsayılan olarak /var/log/syslog dosyasına çalıştırılan zamanlanmış görevler hakkında kayıt düşer. Bu kayıt, görevi çalıştıran kullanıcıyı, görevin çalıştırılmaya başlandığı zamanı ve çalıştırılan görevi icra eden komutun kendisini içerir. grep aracı ile syslog dosyasını aşağıdaki gibi süzebilirsiniz:

Yukarıdaki komut syslog dosyasına düşen tüm cron girdilerini süzerek ekrana basar.

Cron çeşitli detay seviyelerinde log’lar üretebilir ve bunu rsyslog programına göndererek mevcut log sisteminin bir parçası olarak diske yazılmasını sağlar. cron’un log detay seviyeleri ise /etc/default/cron dosyası ile ayarlanır. Dosyayı sudo yetkisi vererek nano editörü ile açtıktan sonra, EXTRA_OPTS=”-L 1″ satırında yer alan –L seçeneğine ilgili değeri yazabilirsiniz.

-L seçeneği ile belirtilebilecek log detay seviyesinin bit değerlikleri ise şunlardır:

  • 0. Bit: log tutma kapalı.
  • 1. Bit: görevin başlama zamanını kaydeder.
  • 2. Bit: görevin bitiş zamanını kaydeder.
  • 4. Bit: görev tamamlandıktan sonra 0’dan farklı bir değer döndürürse günlüğe kaydeder. Değer 0’dan farklı ise görev muhtemelen bir hata kodu döndürmüştür.
  • 8. Bit: Göreve ait tüm çocuk işlemlerin işlem numarasını (process id) günlüğe kaydeder.

Yukarıdaki bit değerlerine göre en detaylı log bilgisinin kayda girmesi için 15 (1,2,4 ve 8’in toplamı) değerini aşağıdaki gibi /etc/default/cron dosyasına kaydedebiliriz:

cron’un kendi log dosyası olan /var/log/cron.log dosyasına da (veya sizin belirleyebileceğiniz herhangi bir dosyaya) kayıt düşmesi için sistemde log tutmaktan sorumlu olan rsyslog servisinin yapılandırma dosyasına aşağıdaki satırı ekleyip servisi yeniden başlatabilirsiniz. Satır normalde mevcuttur; fakat başındaki # karakteri ile etkisizleştirilmiştir. # (diyez/sharp) karakterini satır başından kaldırın ve rsyslog servisini yeniden başlatın.

Eski bir sistem kullanıyorsanız sisteminizde systemctl aracı mevcut olmayabilir; bunun yerine eski usul service aracını kullanabilirsiniz:

Bundan sonra, cron her çalıştırdığı görev için hem /var/log/syslog dosyasına hem de /var/log/cron.log dosyasına birer kayıt düşecektir. Bundan sonra /var/log/syslog dosyasına kayıt düşülmesini istemezseniz /etc/rsyslog.conf dosyasında yer alan şu satırı:

şununla değiştirin ve rsyslog servisini yeniden başlatın.

Dilerseniz varsayılan syslog ve cron.log dosyalarını kullanmadan da göreve özgü log kayıtları tutabilirsiniz. Bunun için öncelikle yukarıda anlatıldığı gibi rsyslog.conf dosyasında cron.* satırının yer almamasını, /etc/default/cron dosyasında ise EXTRA_OPTS=”-L 0” yapılandırmasını uygulayın. Aşağıdaki örnek cron satırını inceleyelim:

Yukarıdaki cron satırı her dakika başında google.com adresine 1 adet ping paketi (-c1 seçeneği) gönderir. ping aracının çıktısını ise logger aracını kullanarak GOOGLE etiketi ile /var/log/syslog dosyasına kaydeder. ping komut satırının ardında kullanılan 2>&1 ifadesi ise stdout (Standar Output) ve stderr (Standart Error) çıktılarının da logger aracına yönlendirilmesini sağlar. logger aracını sınamak için aşağıdaki gibi çalıştırıp ardından syslog dosyasını süzebilirsiniz:

Bu örnekte logger aracı kullanılarak syslog dosyasına bir günlük kaydının düşülmesi sağlanmıştır. Scriptlerinizde veya crontab satırlarınızda syslog’a doğrudan kayıt eklemek için bu araçtan faydalanabilirsiniz. Yukarıda görüldüğü gibi syslog dosyasında oluşturulan satır DENEME tanıtıcı etiketi ile kaydedildi.

Standart G/Ç akışları: stdin, stdout ve stderr

Tüm Linux programları en az bir girdi ve iki çıktı akışı (stream) kanalına sahiptir. Bu akış kanalları işletim sistemi tarafından çalışan programlar ile veya programların birbirleri ile veri alışverişi yapmak için oluşturduğu sanal kanallardır. Bir programa klavyeden veya  > veya >> yönlendirmeleri ile gönderilen girdiler, program tarafından bir stdin girişi olarak ele alınır. Örneğin terminal ekranına printf gibi bir C komutuyla çıktı veren bir program, çıktısını varsayılan olarak stdout kanalına yazar. Linux çekirdeği de eğer varsa programın çıktısını stdout kanalından okuyarak kabuk (bash) programının stdin kanalına aktarır. Program herhangi bir şekilde bir hata ile karşılaştığında veya programcısı tarafından bir istisnaya karşılık hata üretmesi sağlanmışsa, hata çıktısı stderr kanalına yönlendirir. İşletim sistemi stderr kanalından gelen çıktıların normal ekran çıktıları olmadığını bir hata durumunda program tarafından üretilmiş olduğunu anlar ve bu çıktıyı genellikle kullanıcı konsolu açıksa kabuğu stdin kanalına, değilse syslog gibi bir log sistemine girdi olarak yönlendirir. Bu sayede arka plana itilmiş programların konsolu/terminali açık olmasa dâhi ürettiği hatalar kayıt altına alınabilir.

Yazar: Özgür Koca

Yazar - Tankado.com

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.