Ali Şentaş

Basit bir systemd timer kurmak

Bu yazı İngilizce de mevcut.

Bu yazıyı kısa tutacağım. KOU Yemekhane uygulamam için okulun websitesinden yemekleri çekip bunları işleyen bir script yazmıştım. Script düzgün çalışıyordu ama küçük bir problem vardı. Her ayın başında benim bu script’i elle çağırmam gerekiyordu, bazen de bunu unutuyordum, bu yüzden kullanıcı kaybediyordum. Bir keresinde de ay içinde okul menüyü değiştirdi fakat uygulamadaki menüler değişmedi, sonucunda daha da fazla kullanıcı kaybettim. Ama artık gına gelmişti ve cron jon kullanmam gerektiğini anlamıştım ama cron joblar ile ilgili pek de bir şey bilmiyordum (bir tane kurmaya çalıştım ama beceremedim.) bu yüzden de systemd timer’ları öğrenmek iyi bir fikir olsa gerek diye düşündüm.

Shell script yazın

Systemd timer yazmadan önce ilk yapmanız gereken (bu cron joblarda da aynı) bir shell script yazmak, bu script’ten Python scriptini çağırabilirsiniz eğer script’inizi Python’da yazdıysanız çrneğin:

/usr/bin/python3 /python/scriptine/giden/yol/script.py

Script yazarken yolun tümünü verin (~/script.py yazmayın çrneğin) yoksa script çalışmaz.

Bu dosyayı script.sh diye kaydedin herhangi bir yere.

Systemd Servisi kurun

/etc/systemd/system dizinie gidin ve benimscript.service isimli bir dosya oluşturun, bunun içine şunu yazacağız:

[Unit]
Description=Scriptinizin kisa bir aciklamasi

[Service]
ExecStart=/bin/bash /scriptinize/giden/yol/script.sh

Description scriptin küçük bir açıklaması, ExecStart ise servise scripti nerede bulacağını sçylüyor. Ayrıca burada scripti bash ile çalıştırması gerektiğini de söylüyoruz.

Burada ayrı önemli bir nokta ise scriptin önüne /bin/bash yazmanız gerektiği yoksa servis yine çalışmaz. (Denendi çalışmıyor.)

Artık servis oluşturduğunuza göre şimdi onu etkinleştirelim:

sudo systemctl enable benimscript.service

.timer dosyası oluşturun

Son adımda ise deminki system klasöründe bir .timer dosyası oluşturuyoruz. benimscript.timer dosyasını oluşturun ve içine şunu girin:

[Unit]
Description=Her 60 saniyede bir çalışır

[Timer]
# Reboot yaptiktan sonra beklemesi gereken sure
OnBootSec=10min
# Her calistirma arasi gecen zaman
OnUnitActiveSec=60
Unit=benimscript.service

[Install]
WantedBy=multi-user.target

[unit] kısmı kendi kendin açıklıyor asında, buradaki önemli nokta [timer] kısmı. OnBootSec reboot olduktan sonra timer’ın çalışmaya başlamdan önce ne kadar beklemesi gerektiğini söylüyor. OnUnitActiveSec ise servisin her x saniyede bir çağırılması için lzım. x’i burada 60 verdim çünkü ben script’in her 60 saniyede bir çalışmasını istiyorum (okulun menüyü ne zaman değiştireği belli değil). Unit ise hangi servisin çalıştırılması gerektiğini belirtiyor.

Bunu da yaptıktan sonra timer’ı aktifleştirip çalıştırmak gerekiyor.

sudo systemctl enable benimscript.timer
sudo systemctl start benimscript.timer