Belge

Bir Linux İşini Cron Olmadan Nasıl Planlarsınız?

Linux dünyası o kadar çok eğlenceli ve ilginç şeyle dolu ki, ne kadar çok girersek o kadar çok türde şey buluyoruz.

Sizi diğerlerinden farklı kılan bu küçük tüyoları ve ipuçlarını size getirme çabamızda, Linux’ta cron yardımcı programını kullanmadan bir iş planlamak için birkaç alternatif yöntem bulduk.

Linux’ta bir iş/komut planlamak, cron’un görevidir. Ne zaman bir iş planlamamız gerekirse, cron komutunu çağırırız, ancak cron olmadan daha sonra bir iş planlayabileceğimizi biliyor musunuz?

1. Uyku Döngüsü Kullanarak Linux’ta İşleri Zamanlama

Her 5 saniyede bir komut çalıştırın (tarih söyleyin) ve çıktıyı bir dosyaya yazın (tarih.txt deyin). Bu senaryoyu gerçekleştirmek için, aşağıdaki tek satırlık komut dosyasını doğrudan komut isteminde çalıştırmamız gerekir.

$ while true; do date >> date.txt ; sleep 5 ; done &

Yukarıdaki tek satırlık betiğin anatomisi:

  • while true – Komut dosyasının koşul doğruyken çalışmasını isteyin, komutun tekrar tekrar çalışmasını veya bir döngü içinde söylemesini sağlayan bir döngü görevi görür.
  • do – aşağıdakileri yapın, yani, do deyiminden önce gelen komutu veya komut dizisini yürütün.
  • date >> date.txt – burada date komutunun çıktısı bir date.txt dosyasına yazılıyor. Ayrıca, >> kullandığımıza ve > kullanmadığımıza dikkat edin.
  • >> komut dosyası her çalıştırıldığında dosyanın (date.txt) üzerine yazılmamasını sağlar. Sadece değişiklikleri ekler. Oysa > dosyanın üzerine tekrar tekrar yazar.
  • sleep 5 – Yeniden yürütülmeden önce kabuktan 5 saniyelik bir zaman farkı tutmasını ister. Buradaki sürenin her zaman saniye cinsinden ölçüldüğüne dikkat edin. Diyelim ki komutu her 6 dakikada bir yürütmek istiyorsanız, art arda uykuda (6*60) 360 kullanmalısınız.
  • done – while döngüsünün sonunu işaretler.
  • & – Tüm süreci arka plana bir döngüye koyar

Benzer şekilde, herhangi bir betiği aynı şekilde çalıştırabiliriz. Belirli bir aralıktan sonra (örneğin 100 saniye) bir betiği çağırma komutu buradadır ve betiğin adı script_name.sh’dir.

Ayrıca, yukarıdaki komut dosyasının, çağrılacak komut dosyasının bulunduğu dizinde çalıştırılması gerektiğini, aksi takdirde tam bir yol (/home/$USER/…/script_name.sh) sağlamanız gerektiğini belirtmekte fayda var.

Komut dosyasını yukarıda açıklanan aralıkta çağırmak için sözdizimi şöyledir:

$ while true; do /bin/sh script_name.sh ; sleep 100 ; done &

Not: Yukarıdaki tek satırlık, Cron’un yerine geçmez çünkü Cron yardımcı programı, kıyaslandığında pek çok seçeneği destekler ve özelleştirilebilir olduğu kadar çok esnektir.

Ancak, belirli test durumlarını veya G/Ç kıyaslamalarını çalıştırmak istiyorsak, yukarıdaki tek komut amaca hizmet edecektir.

2. Systemd Zamanlayıcılarla Görevleri Planlayın

Çoğu modern Linux dağıtımında, Systemd varsayılan başlangıç ​​sistemidir ve görevlerinizi zamanlamanıza olanak tanıyan bir zamanlayıcı işleviyle birlikte gelir.

İlk olarak, gösterildiği gibi .timer uzantılı yeni bir systemd timer birim dosyası oluşturun.

$ sudo nano /etc/systemd/system/myjob.timer

Aşağıdaki içeriği myjob.timer dosyasına ekleyin:

[Unit]
Description=My Job Timer

[Timer]
OnCalendar=*-*-* 00:00:00
# Replace the OnCalendar value with the desired schedule

[Install]
WantedBy=timers.target

Bir systemd zamanlayıcı birimindeki OnCalendar alanı, belirli bir biçim kullanarak işiniz için zamanlamayı belirtmenize olanak tanır.

  • Yearly: yıllık veya yıldönümü
  • Monthly: aylık
  • Weekly: weekly
  • Daily: günlük veya gece yarısı
  • Hourly: saatlik
  • Minutes: *:DD (örneğin, her 15 dakikada bir *:15) biçimini kullanarak belirli bir dakika veya DD-MM kullanarak belirli bir aralık (örneğin, 10’dan 30’a kadar her dakika için 10-30) belirleyebilirsiniz.

Formatı göstermek için bazı örnekler:

## Run every day at 3:00 AM ##
OnCalendar=*-*-* 03:00:00

## Run every Monday and Friday at 10:00 AM ##
OnCalendar=Mon,Fri *-*-* 10:00:00

## Run every 30 minutes: ##
OnCalendar=*-*-* *:0/30:00

Ardından, aynı dizinde .service uzantılı karşılık gelen bir hizmet birimi dosyası oluşturun:

$ sudo nano /etc/systemd/system/myjob.service

Aşağıdaki içeriği myjob.service dosyasına ekleyin:

[Unit]
Description=My Job

[Service]
ExecStart=/path/to/your/job.sh
# Replace "/path/to/your/job.sh" with the actual command or script to execute

[Install]
WantedBy=multi-user.target

Zamanlayıcıyı etkinleştirin ve başlatın:

$ sudo systemctl enable myjob.timer
$ sudo systemctl start myjob.timer

Bu, işinizi belirtilen zamanlayıcıya göre çalışacak şekilde programlayacaktır.

3. Anacron Kullanarak Görevleri Zamanlama

Anacron, her zaman açık olmayan sistemlerde işleri periyodik olarak planlamanıza izin veren zamana dayalı bir iş planlayıcıdır. Cron’a düzenli erişimi olmayan sistemler için tasarlanmıştır. Sisteminizde anacron kuruluysa, işinizi planlamak için onu kullanabilirsiniz.

Kurulu değilse, paket yöneticinizi kullanarak kurabilirsiniz.

$ sudo apt install anacron         [On Debian, Ubuntu and Mint]
$ sudo yum install anacron         [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
$ sudo emerge -a sys-apps/anacron  [On Gentoo Linux]
$ sudo apk add anacron             [On Alpine Linux]
$ sudo pacman -S anacron           [On Arch Linux]
$ sudo zypper install anacron      [On OpenSUSE]    

/etc/anacrontab.d/ dizininde işiniz için yeni bir yapılandırma dosyası (myjob.sh) oluşturun.

$ sudo nano /etc/anacrontab.d/myjob.sh

Yapılandırma dosyasında işinizin ayrıntılarını belirtin.

# Run myjob.sh every day with a delay of 5 minutes
1 5 myjob /path/to/myjob.sh

Konfigürasyon dosyasındaki alanlar aşağıdaki anlamlara sahiptir:

  • İlk alan, işin çalıştırılması gereken zaman aralığıdır. @daily, @weekly, @monthly, or @yearly.
  • İkinci alan, sistem başladıktan sonra işin yürütülmesini geciktirmek için dakika cinsinden süredir.
  • Üçüncü alan, günlük dosyaları oluşturmak için kullanılacak iş adıdır.
  • Dördüncü alan yürütülecek komut veya komut dosyasıdır.

Şimdi, Anacron işinizi belirtilen programa göre otomatik olarak yürütecektir.

Yazının orijinalini buradan okuyabilirsiniz.