Bir işletim sisteminin sorunsuz çalışmasını temin etmenin en iyi yollarından birisi otomatik tasarlanmış görevlerdir. Cron ve at programları sistem yöneticisini rahatsız etmeksizin belirli görevlerin daha önceden belirlenmiş zamanlarda çalıştırılmasını sağlarlar.
Cron Programı
Cron (Chronography’nin kısaltması) programı, belirli komutları belirli zamanlarda herhangi bir kişinin doğrudan başlatmasına gerek kalmaksızın çalıştırmasını sağlamak için tasarlanmıştır.
Linux, cron’u sistem açıldığında bir saat “deamon’u” olarak yükler. Cron programı, genellikle bir rc dosya girişinden çalıştırılır, bunu devre dışı bırakmak için ise ilgili satırlar comment satırı yapılır. Çalıştığında, Cron crontab dosyası olarak adlandırılan bir dosyadan belirli bir görevi çalıştırmak zorunda olduğu gün ve zamanı okur.
crontab dosyasının gün ve zamanın tanımladığı girişlerinden biri ile sistemin gün ve zamanı örtüşürse cron deamonu ilgili komutu çalıştırır. Görevlerin otomatik yapılmasının anlamı, teyp yedeklemesi, veritabanı reorganizasyonu ve genel dosya temizlemesi gibi düzenli olarak yapılan görevlerin bir otomatiğe bağlanmasıdır.
Çoğu sistemde, cron’a erişim sistem yöneticisi ile sınırlıdır ama bu özellik bazı kullanıcılara veya tüm kullanıcıların hizmetine konuşlandırılabilir. Sistem yöneticileri, iki farklı dosyadan biri aracığı ile kimin cron tarafından devreye sokulmuş bir süreç yollayabileceğini kontrol eder.
Bu dosyalar genellikle /usr/lib/cron/cron.allow veya /usr/lib/cron/cron.deny dır. Çoğu linux sistemi bu iki dosyayı kullanır, ve her iki dosyada da her iki satırda bir kullanıcı ismi vardır.
/usr/lib/cron/cron.allow (veya /etc/cron.d/cron.allow) dosyası cron programını kullanmasına izin verilen tüm kullanıcıların kullanıcı isimlerini içerir. Örneğin, dosya
mscelebi
bill
tparker
Sadece mscelebi, bill ve tparker’ın cron kullanacak herhangi bir görev teslimi yapabileceğini söylemektedir.
/usr/lib/cron/cron.deny dosyası cron kullanmasına izin verilmeyen kullanıcı isimlerini barındırır. Örneğin, dosya
walter
mehmet
celal
walter, mehmet ve celal dışında herkesin cron programını kullanabileceğini belirlemektedir. Eğer ne cron.allow ne de cron.deny dosyası mevcut değilse bu durumda sadece root bu programı kullanabilir. Tüm kullanıcıların cron’u kullanabilmesi için boş bir cron.deny dosyası oluşturmak yeterlidir.
Bir Cron Dosyası Oluşturmak
Komutları istenen gün ve zamanlarda çalıştıran bir cron dosyası oluşturmak için, crontab adlı yardımcı programı kullanmalıyız. Cron’un ne yapmasını istediğiniz işlerin detayını içeren bir dosyayı crontab programı okur ve işleme koyar. İlave olarak crontab, sizin o anki cron görev listenizi göstermek, listeyi kaldırmak ve ilave görevleri listeye eklemek gibi diğer birkaç yönetsel görevi de ifade eder. Görevlerin yazılı olduğu dosyaya kolaylık olsun diye crontab ismi verilir ama siz her hangi bir isim de verebilirsiniz.
Crontab talimat dosyasının basit bir yapısı vardır. Dosya her süreç için bu sürecin detaylarını içeren tam bir satırdan oluşur ve değişik süreçleri ve ilgili satırları içerir. Her satırın formatı aşağıdaki gibidir:
minute hour day-of-month month-of-year day-of-week command
Gerçek bir crontab dosyasından alınan iki satır aşağıdaki gibidir.
20 1 * * * /usr/bin/calendar-
0 0 * * * /bin/organize_data
Crontab dosyasındaki her satır, bir boşlukla ayrılmış 6 sütundan oluşur. Soldan sağa bu sütunlar aşağıdaki gibidir.
- - Saatin dakikası (0-59)
- - Günün saati (0-23)
- - Ayın günü (1-31)
- - Ay (1-12)
- - Haftanın günü (sun = paz = 0, mon = pazts = 1,…..sat = cmts = 6)
- - Belirtilen gün ve zamandaki çalıştırılacak program
Crontab dosyasındaki belirtilen gün ve zamanda işlem başlatılır. Bu aşamada komutun işletilmesi için doğru pathname vermek çok önemlidir. Crontab dosyasının çalıştırılması için çalıştırma iznine sahip olmanız gerekmektedir. Eğer bir iki sayı kullanacak isek araları “-“ işareti ile ayrılmalıdır. Örneğin 1-5 birden beşe kadar olduğunu göstermektedir. Aşağıdaki örneği detaylı inceleyelim.
20 1 * * * /usr/bin/calendar-
0 2 1 * 0 /bin/organize_dta
10,30,50 9-18 * * * /bin/setperms
Bu örnek üç farklı süreci tanımlamaktadır. İlk komut /usr/bin/calendar- dir. Bu yılın her günü ve haftanın her günü sabah saat 1’i 20 geçe çalıştırılır. Yıldızın anlamı tüm değerler demektedir. Saat 2:00 AM’de bir betik dosya olan /bin/organize_data her ayın ilk gününde (3. sütunda 1) ve her Pazar (5. sutunda 0) günü çalıştırılır. Eğer ilk gün Pazar ise sadece bir kere çalıştırılacaktır. Üçüncü satırda bir betik dosya olan /bin/setperm, haftanın her gününde 9:00 AM ile 6:00 PM arasında her saat başı 10, 30, 50 dakika geçe çalıştırılır. Crontab dosyasındaki girişler özel bir sırada olmak zorunda değildirler. Crontab dosyanızda bir hata oluştuğunuzda cron size problem ile ilgili bir posta yollar. Crontab dosyanızı ev dizininizin içinde tutmaya özen gösteriniz.
Crontab dosyanızı yazdıktan sonra, çalıştırmak için cron’a teslim edebilirsiniz. Bir crontab dosyası teslim ettiğinizde, dosyanın bir kopyası hazırlanır ve cron klasöründe (genellikle /var/spool/cron/crontabs da) korunur. Dosyayı teslim eden kullanıcının ismiyle saklanır. Örneğin mscelebi tarafından teslim edilen bir crontab dosyası /var/spool/cron/crontabs/mscelebi ismiyle saklanır. Superuser tarafından teslim edilen crontab dosyaları root ismine sahiptir. Cron’a crontab dosyanızı teslim etmek için cron komutları içinde olan dosyanın ismini takip ettiği crontab komutunu kullanın. Örneğin komut:
crontab crontab_dosyasi
Cron’a mevcut klasörde crontab_dosyasi isimli dosyayı teslim eder. Eğer daha önceden bir crontab dosyası teslim etmişseniz, eskisi kaldırılır yerine yeni dosya kullanılır.
-l opsiyonu kullanarak cron’a ne teslim ettiğinizi görebilirsiniz. Örneğin:
crontab –l
tüm komut cron görevlerini komutu teslim eden kullanıcıya gönderir. Crontab dosyanızı kaldırmak için –r, opsiyonu kullanabilirsiniz. Bu opsiyon /var/spool/cron/crontabs ’dan sizin dizininizde saklanan dosyayı siler.
crontab –r
Son olarak, o anki geçerli olan cron dosyanızı çağırıp bir editör -e opsiyonu ile başlatabilirsiniz. Aşağıdaki komutu kullandığınızda :
crontab –e
crontab mevcut olan crontab dosyanızı okur, ve onu default (benimsenmiş) editöre (örneğin vi) yükler. Edit edilmiş dosyayı sakladığınızda bu dosya cron’a otomatik olarak teslim edilir. Crontab dosyasındaki değişiklikler en fazla beş dakika içinde devreye girer ve cron crontab dosyasını en az her beş dakikada bir okur.
Crontab dosyası her tür komut ve kabuk betiği içerebilir. Çok sayıda kabuk komutu kullanılması durumunda karşılaşılabilen yaygın problem özellikle hata mesajlarının (ki size postalanırlar ve posta kutunuzu hızla doldururlar) ve çıktıların üretilmesidir. Bu nedenle, hata mesajlarının çıktılarını almak istemiyorsanız çıktıları /dev/null’a yönlendirebilirsiniz. Örneğin :
0 * * * * date > /tmp/test1 2>dev/null
date komutunun çıktısını, her saat başı /tmp/test1 isimli bir dosyaya ve hata mesajlarını /dev/null’ a yollar. Benzer şekilde:
30 1 * * * cat /usr/tparker/chapt* > /usr/tparker/archive/backup
/usr/tparker’da chapt ile başlayan tüm dosyaları backup isimli tek bir büyük dosyaya bağlar.
Crontab dosyasında aynı zamanda boru (piping) işlemi de yapabilirsiniz. Örneğin, eğer sizde /temp/userlist dosyasında gün boyunca sisteme bağlanan kullanıcıların bir listesi varsa aşağıdakine benzer bir crontab dosyası girdisine sahip olabilirsiniz :
0 1 * * * sort -u /tmp/userlist/ | mail –s ”user for today” root
Bu satır /tmp/userlist ‘in çıktısını kontrol eder, öyle ki her kullanıcı (-u veya unique opsiyonu) için sadece bir giriş olduğunu ve bunu da root’a postalar.
Önemli bir hatırlatma: Tüm cron komutları default olarak Bourne shellde (bash kabuğu) çalıştırılır. Eğer C kabuk komutları kullanıyorsanız, cron görevi başarısız olacaktır.