Crontab Nedir? Nasıl Kullanılır?
Cron Job nedir, nasıl kullanılır ve zaman nasıl tanımlanır sorularının cevaplarına giriş niteliğinde Cron Job Nedir? Nasıl Kullanılır? başlıklı yazıda değindim. Bu yazıda ise konsol üzerinden görev tanımlama işlemleri için kullanacağımız crontab ile ilgili bilgiler vereceğim.
Crontab Kullanımı
Unix temelli (Linux dağıtımları, macOS, BSD, FreeBSD vb.) sistemlerde kullanılan crontab
, belirlediğiniz bir zaman ya da zaman diliminde belirlediğiniz komut, script ya da uygulamanın çalışmasını sağlayabilirsiniz. Temelde işlemin gerçekleştirileceği zaman(lar) ve tekrar ardından işlemin kendisi tanımlanarak crontab
dosyasına eklenmesi şeklinde gerçekleştirilir. crontab dosyasına /etc/crontab üzerinden metin editörüyle (ön tanımlı olarak vim
ile görüntülenir, ancak editör tanımlanarak da işlenebilir) ulaşılabilir. Yeni bir görev satırı eklendiğinde komut satırından işlemin sıraya alındığına dair bildirim alınır ve işlem(ler) bu süreç itibariyle belirtilen zamanda uygulanmak üzere bekletilir1. Ekli görevler listeleme (-l
) parametresiyle görüntülenebilir. O halde, örnek olarak random adında bir shell script (*.sh
) oluşturalım. Bu script random olarak 0-100 arasında bir sayı üretsin ve ürettiği sayıyı number.log
isimli dosyamıza yazsın. Öncelikle random adındaki shell script dökümanımızı (random.sh) oluşturalım2.
touch random.sh
nano random.sh
random.sh
dosyamıza script kodumuzu ekleyelim.
#!/bin/bash
NUMBER=$[ ( $RANDOM % 100 ) + 1 ] && echo $NUMBER >> ~/number.log
Şimdi de number.log
dosyamızı oluşturalım.
touch number.log
Son olarak da, her 1 dakikada bir işleme alınacak crontab görevini yeni bir satır olarak ekleyelim.
* * * * * ~/random.sh
Birkaç dakika sonra number.log
dosyamızın içeriğine göz attığımızda satır satır eklenmiş olan kayıtları görebiliriz.

Ek bir not, vim
yerine nano
ile crontab dökümanını tek seferlik görüntülemek (ön tanımlı editörü değiştirmeden) istersek aşağıdaki komutu kullanabilirsiniz.
env EDITOR=nano crontab -e
Son olarak, crontab işlemlerinin silinmesinden bahsedeyim. Çok gerek olacağını sanmıyorum ancak crontab içeriğini temizlemek, tüm görevleri silmek isterseniz remove (-r
) parametresini kullanabilirsiniz. Bu işlem herhangi bir yedek olmaksızın görevleri silecektir. Herhangi bir nedenden dolayı crontab işlemleri gerçekleşmeyebilir. Bu gibi durumlarda sorunu bulabilmeniz adına syslog
kayıtlarına göz atabilirsiniz. Aşağıdaki komut size ilgili olabilecek hatalarla ilgili bilgi verebilir.
grep CRON /var/log/syslog
Detaylı Zaman İşlemleri
Cron Job ile ilgili yazıda temel zaman ifadelerine değinmiştim. Şimdi bu ifadeleri biraz daha genişletmek istiyorum.
Gün İçerisinde Birden Çok Tekrarlı Zaman İfadesi
Her gün, öğlen 12.00 ve akşam 15.00 saatlerinde
00 12,15 * * * [komut-veya-script]
Açıklama
00
– Her Saat (00 Saat başlangıcı) 12
,15
– Öğlen 12’de ve Akşam 15’de *
– Her Gün *
– Her Ay *
– Haftanın Her Günü
Hafta İçerisinde Birden Çok Tekrarlı Zaman İfadesi
Hafta içi günlerde, sabah 10 ve akşam 17 arasında, her saat
00 10-17 * * 1-5 [komut-veya-script]
00
– Her Saat (00 Saat başlangıcı) 10
–17
– sabah 10’dan akşam 18’e her saat *
– Her Gün *
– Her Ay 1-5
– Pazartesi (1)’den Cuma’ya (5)
Kısayol Zaman İfadeleri
* * * * *
yerine genel zaman ifadeleri kullanılarak da pratik şekilde zaman tanımlamaları yapabilirsiniz.
@reboot
bir defa ve başlangıçta.@yearly
ya da@annually
: Yılda bir defa (0 0 1 1 *
)@monthly
ayda bir defa (0 0 1 * *
)@weekly
haftada bir defa (0 0 * * 0
)@daily
ya da@midnight
günde bir defa (0 0 * * *
)@hourly
saatte bir defa (0 * * * *
)
Örneğin, her yıl çalıştırılmasını istediğimiz bir yedekleme işlemi tanımlamak istiyoruz. Bu görev için yazılmış bir script’imiz mevcut. Ekleyeceğimiz crontab satırımız şu şekilde olacaktır.
@yearly [komut-veya-script]
Daha farklı kullanım biçimleri için Ubuntu > Cron sayfasını inceleyebilirsiniz3. Son bir örnek olarak da her hafta Pazartesi günü sabah saat 9’da, earthquake.usgs.gov adresinden aylık deprem kayıtlarını4 çekelim ve eq.log
isimli dosyamızda loglayalım. Bunun için öncelikle script oluşturmamız gerekir. Script dosyamızın adı getEQ.sh olsun.
#!/bin/bash
curl -s https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/significant_month.csv | tail -n +2 | awk -F"," '{print $5" " $14$15}' >> ~/eq.log
Şimdi de crontab
içerisinde yeni görev satırımızı oluşturalım.
0 9 * * 1 ~/eq.sh
Crontab ile ilgili olarak SSH portlarının aktif/pasif hale getirilmesi, veritabanı yedeğinin alınması, bir adresten veri çekilmesi, scp
ve rsync
ile uzak sunucuya veri gönderilmesi, SSL sertifikalarının yenilenmesi, wp cron
üzerinden wordpress işlemlerinin gerçekleştirilmesi, doctl
üzerinden server oluşturma gibi konularda ayrıca örneklendirmelerde bulunacağım.