Basit bir systemd timer kurmak

Bu yazıyı kısa tutacağım. KOU Yemekhane uygulamam için okulun web sitesinden yemekleri çekip bunları işleyen bir betik yazmıştım. Betik düzgün çalışıyordu ama küçük bir problem vardı: Her ayın başında onu elle çağırmam gerekiyordu. Bazen bunu unutuyordum ve bu yüzden kullanıcı kaybediyordum. Bir keresinde okul ay içinde menüyü değiştirdi fakat uygulamadaki menüler değişmedi; sonucunda daha da fazla kullanıcı kaybettim. Artık gına gelmişti ve bir cron job kurmam gerektiğini anlamıştım, ancak cron joblar hakkında pek bir şey bilmiyordum. Bu yüzden systemd timer’ları öğrenmenin iyi bir fikir olacağını 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]
# Yeniden başlattıktan sonra beklemesi gereken süre
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