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.

AA

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.

Crontab

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ı) 1017 – 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.