Cron sürekli tekrarlanan komut ve scriptler için kullanılabilir.Kullanıcılar cron görevlerini /var/spool/cron/crontabs klasörüne ekleyebilirler. Aşağıdaki ipuçları birçok durumda cron sorunlarının çözülmesinde yardımcı olabilir.
Önemli Cron dosyaları:
Dosya İşlevi
/etc/cron.d/cron.allow Cron görevlerini eklemeye yetkili kullanıcı listesi
/etc/cron.d/cron.deny Cron görevlerini eklemeyecek kullanıcı listesi
/var/cron/log Log Dosyası
/var/spool/cron/crontabs Tüm kullanıcılar için Crontab dosyları
Crontab dosyalarını düzenleme
En kolay yolu crontab -e komutudur. Başka bir yolu ise;
- kullanıcınız ile oturum açın.
- Crontab -l > dosyaismi
- vi dosyaismi ( istediğiniz değişiklikleri yapın)
- Crontab dosyaismi
Bunları yaptıktan sonra Cron servisini durdurmanıza gerek yoktur.
Cron servisinin durumunu kontrol etme:
# ps -ef | grep cron
Servisi durdurup başlatma:
# /etc/init.d/cron [stop|start]
Solaris 10’da Cron servisinin durumunu kontrol etme:
# svcs -p svc:/system/cron
Cron görevlerinin düzgün çalıştığından emin olmak için aşağıdaki satırı crontab’a ekleyin.
* * * * * date > /dev/console
Bu komut her dakika başında konsola tarihi basacaktır. Eğer konsolda yetkiniz yoksa, çalıştığınız pts terminali kullanabilirsiniz.
Crontab’a erişimi kontrol etme:
- /etc/cron.d/cron.allow ya da /etc/cron.d/cron.deny dosyaları kullanabilirsiniz. Burada şuna dikkat etmeniz lazım. Eğer cron.allow dosyası yok ise cron.deny dosyası geçerli olacaktır. Cron.allow dosyası var ise ilk önce bunu kontrol eder.
- Eğer bir kullanıcı iki dosyada mevcut ise cron.allow dosyası okunur cron.deny dosyası okunmaz.Yani kullanıcının erişim hakkı olur.
- Eğer iki dosya da mevcut değil ise yalnızca root görevleri çalıştırabilir.
Yetkileri ve Script yolunu kontrol etme:
Aptalca gelebilir fakat, çalıştırmak istediği scripte executable yetkiyi vermeyen birçok insan gördüm.
# chmod u+x /path/to/script
Ayrıca cron girdiniz scriptin tam yolunu içermelidir.
* 5 * * * /bin/bash /path/to/script.sh
Cron Loglarını kontrol edin.
/var/cron/log log dosyası birçok durumda sorunun ne olduğu ile ilgili net ve doğru bilgiler veriyor.
Crontab’ı boşaltırken dikkatli olun.
Crontab -e ile tüm cron görevlerini silseniz de , crontab -l tüm cron görevlerini gösterir. Çünkü crontab -e boş crontab dosyası ile ne yapacağını bilemez ve değişiklikleri güncellemez. Tüm görevleri silmenin uygun yolu şudur:
# crontab -r
Cron yetkilerini kontrol edin.
Bazen “error in message queue open” hatası ile karşılaşabilirsiniz. Bunun nedenlerinden biri de cron ve crontab’ a verilen hatalı yetkilerdir. Cron ve Crontab’ın düzgün yetkileri:
# ls -l /usr/sbin/cron
-r-xr-xr-x 1 root sys 57420 Jan 22 2005 /usr/sbin/cron
# ls -l /usr/bin/crontab
-r-sr-xr-x 1 root bin 20336 Jan 22 2005 /usr/bin/crontab
Setuid yetkilerine dikkat edin.
Crontab-e komutu birtakım numaralar ve soru işareti ile cevap veriyor.
Bunun nedeni varsayılan editorun “vi” olarak ayarlanmamasından kaynaklanıyor. Düzeltmek için;
# EDITOR=vi
# export EDITOR
Kullanıcının parola süresi geçmiş.
Birçok kez sadece kullanıcının parola süresi dolduğu için cron görevleri başarısız olur.
/var/cron/log’ta şu hatayla görülebilir.
Authentication token is no longer valid; new one required
CRON (oracle) ERROR: failed to open PAM security session: Success
CRON (oracle) ERROR: cannot set security context
Düzeltmek için kullanıcının parola süresini uzatın :
# passwd -x 10 oracle (oracle burada kullanıcı ismi)
Özel karakterleri ve anlamlarını yönlendirme:
0 5 * * * /bin/bash -l -c ‘export RAILS_ENV=my_env; cd /my_folder; ./script/script.rb 2>&1 > ./log/my_log.log’
Dosya açıklayıcısını yönlendirme:
3 adet standard dosya açıklayıcısı vardır :
1. stdin 0 – Program Standard girişi.
2. stdout 1 – Program Standard çıkışı.
3. stderr 2 – Programdan Standard hata çıkışı.
Normalde stdin klavyedendir. stdout ve stder terminale gider. Fakat bunu yönlendirebiliriz.
“2>&1”. Standard hata çıkışını komuttan al ve standard çıkış nereye gidiyorsa oraya yönlendir demektir.
Bazı semboller:
; | Tek satırdaki iki komutu ayırmak için kullanılır. |
& | Komutu arka planda çalıştırır. |
&& | Takip eden komutu bir önceki komut başarılı ise çalıştır. Başarılı değilse çalıştırma demektir.(örnek: grep string dosyaadı && cat dosyaadı) |
|| | Takip eden komutu bir önceki komut başarılı olarak çalışmamışsa çalıştır. (örnek, grep string dosyaadı || echo “”String not found””)” |
( ) | Parantez içindeki komut alt kabukta çalışır. |
‘ | Bu işaretten sonraki özel anlamlı karakterlere anlamı dahilinde yol verme. Düz oku demektir. |
Bir sonraki karakteri harfi harfine yorumla. Ayrıca bir satırdan fazla süren komutlar için kullanılır. Böylelikle kullanıcı yazmaya devam edebilir. | |
” “ | Değişken(variable) ve komut değişimlerine izin ver. |
`komut` | bu komutun çıktısını değişken olarak algıla. |
# | Bu işaretten sonraki herşey yorum olarak algılanır ve işlem yapılmaz. Unutkan biriyseniz yorumlarınızı yazmanızda fayda var. 3 ay sonra neyi neden yaptığınızı hatırlamanızda fayda sağlar. |