cronjobs

Zamanlanmış Görev (Cronjobs) Nedir? Nasıl Kullanılır?

Bu yazının içeriği tamamen orjinaldir. Kesinlikle başka yerde yayınlayamazsınız. Sadece pingback veya link olarak kaynak verebilirsiniz.


Zamanlanmış Görev (Cronjob) Nedir?

Zamanlanmış görev, belirli bir işi belirli bir zamanda veya zamanlarda yapmamızı sağlayan komutlar bütünüdür. Zamanlanmış Görev ismi Linux sunucularından gelmektedir. Windowsta ise Görev Zamanlayıcı şeklinde bulabilirsiniz. Zamanlanmış görevler, belirli aralıklarla yapmamız gereken işlemleri bize otomatik olarak yapar. Örneğin; belirli zaman aralıklarında cache klasörünüzün içinin temizlenmesini istiyorsanız veya hem dosya hem de mysql yedeği almak istiyorsanız, zamanlanmış görevler tam size göre.

Nasıl Kullanılır?
Nasıl kullanılır sorusunun aslında birden fazla cevabı var. Ancak hepsindeki temel mantık aynı. Ben komut satırı (veya SSH) üzerinden yapılanlara girmeyeceğim. Aslında bu konuyu açamamdaki en büyük etmenlerden bir tanesi zamanlanmış görev ile uzak bir web sitesini çağırmaktı. Her neyse oraya sonra geleceğiz. Ben sizlere sadece web kontrol panelleri (örn. cpanel) üzerinde bu işlemleri nasıl yapacağımızı, hangi komutun ne işe yaradığını anlatacağım.

Önce Zamanlama
Zamanlanmış görevlerden ilk başlık “Zaman Ayarları”dır. Son sürüm Cpanel üzerinde bu ayarlar açılır kutu ile kolayca seçilebilir şekilde verilse de, mantığını bilmekte büyük fayda var. Zamanlanmış görevlerle birlikte kullanılabilecek 5 farklı zaman dilimi mevcut. Bunlar sırasıya “Dakika”, “Saat”, “Ayın Günü”, “Ay” ve “Haftanın Günü” şeklindedir. Bunları kısaca açıklayacak olursak;

0 ile 59 arasında bir değer alabilir. Ayrıca * / – ve , işaretleri de belirli şartlar sağlandığında kullanılabilir.
0 ile 23 arasında bir değer alabilir. Yine * / – ve , işaretleri de belirli şartlar sağlandığında kullanılabilir.
1 ile 31 arasında bir değer alabilir. Yine * / – ve , işaretleri de belirli şartlar sağlandığında kullanılabilir.
1 ile 12 arasında bir değer alabilir. Yine * / – ve , işaretleri de belirli şartlar sağlandığında kullanılabilir.
0 ile 6 arasında bir değer alabilir. Yine * / – ve , işaretleri de belirli şartlar sağlandığında kullanılabilir. 0 Pazar gününü, 6 ise Cumartesi gününü ifade eder.
* işareti her anlamındadır. Yani dakika için * işaretini kullanmak, her dakikada demektir.
/ işareti “da bir” anlamındadır.  Mesela; saat için konuşacak olursak, */2 her iki saatte bir demektir.
– işareti “x ten y ye kadar” gibi bir anlam çıkartır. Mesela haftanın günü için 1-5 Pazartesiden Cumaya kadar demektir.
, işareti ise tek ayrımlarda kullanılır. Mesela ayın günleri için 1,5,15,27 demek, belirtilen ayın 1. 5. 15. ve 27. günleri çalışacak demektir.

Yine zamanlar belirtilirken, sırasıyla “dakika, saat, ayın günü, ay ve haftanın günü” sıralaması kullanılır.

Komutlar
Zamanlanmış görevlerde “linux” sistemlerde linux komutları, windows sistemlerde windows komutları kullanılır. Örneğin linux bir sistemde herhangi bir klasörün içerisindeki dosyaları silmek için şöyle bir komut kullanabiliriz:

rm /home/kullaniciadi/tmp/*

Tüm alt klasörler dahir herşeyi silmek için ise;

rm -vrf /home/kullaniciadi/tmp/*

komutunu kullanabilirsiniz.

Şimdi asıl zurnanın zırt dediği noktaya gelelim. Benim bu yazıyı yazmamdaki amaca gelelim. Diyelim ki, sunucunuz üzerindeki bir PHP dosyasını çalıştırmak istiyorsunuz. Kullanacağınız komut:

php /home/kullaniciadi/public_html/dosyadi.php
veya;
/usr/bin/php /home/kullaniciadi/public_html/dosyadi.php

komutlarını kullanabiliyoruz. php veya /usr/bin/php komutundan sonra -q komutunu kullanırsak, geriye herhangi bir dönüş istemediğimizi belirtiyoruz. Yine bu komutları kullanırken çalıştırmak istediğimiz dosyaya herhangi bir parametre göndermek istersek $argv globalini kullanmamız gerekecektir. Şöyle ki;

php /home/kullaniciadi/public_html/dosyadi.php deger1 deger2 deger3

şeklinde parametreler gönderilebilir. Gönderdiğimiz bu parametreleri okuyabilmek için dosyadi.php içerisinde $argv globalini kullanmamız gerekecektir. Detaylı bilgi için php.net’in sitesine bakabilirsiniz.

Bu işin daha kolayı da var. Onlardan birtanesi de wget yani dosya çekme metodu. Dos ortamında çalışan programlar veya linux üzerinde komut satırında bir program kuracağınız zaman genellikle dosyaları indirmek için wget metodunu kullanırız. Bundan yola çıkarak wget yöntemiyle istediğimiz dosyayı çalıştırabiliriz. Örneğin yine dosyadi.php dosyamızı çalıştıracak olursak;

wget http://sitemizinadi.com/dosyadi.php

şeklinde kullanabiliriz. Bu yöntemde query string kullananlar bazen sıkıntı yaşadıklarını belirtiyorlar ancak ben herhangi bir sorunla karşılaşmadım bugüne kadar. Ancak wget yönteminde karşılaştığım tek şey, bunun bir dosya indirme yönetmi olmasından dolayı zamanlanmış görevi çalıştırdıktan sonra sistemin size gönderdiği raporda dosyanın çalışması sonucu ürettiği şeyleri size düzgün loglamaması. Yani sistem size şunu diyor; “ben dosyadi.php dosyasını başarıyla çalıştırdım ve bana ne verdiyle onu indirdim. Ama indirdiğim dosyanın içinde ne yazıyor onu sana söyleyemem. Sen onu bir yere kaydetmişsen git oradan oku.” Böyle olunca da ister istemez  wgetten soğuyorsunuz, çünkü siz cron ile çalıştırdığınız dosyada bazı kontroller yapıyorsunuz ve bunun sonucuna göre belirli bilgileri almak istiyorsunuz. İşte wget yönteminde bu bilgileri alamıyorsunuz.

Gelelim işin en kolayına; GET methodu. Tanıdık geldi değil mi? Evet çok basit bir şekilde zamanlanmış görev için

GET http://sitemizinadi.com/dosyadi.php?adi=erdem&soyadi=arslan

şeklinde çalışabiliyorsunuz. Ve normal tarayıcı ekranında bu sayfa çalıştıktan sonra size ne gösteriyorsa, aynısını cron üzerinde de yapıyor. Ancak orada göstermek yerine size sayfanın çıktısını mailliyor veya belirteceğiniz log dosyasına kaydediyor. Gördüğünüz gibi yukarıda saatlerce anlatmaya çalıştıklarımı burada hop diye yapıverdik.

Geri Bildirim
Zamanlanmış görevler ile gerçekleştirilen her işlem için bir sonuç üretilir. Bu sonuç varsayılan olarak sunucuda kayıtlı olan mail adresine gönderilir. Cpanel üzerinde bu mail adresini değiştirebilirsiniz. Diğer panellerde de mutlaka mevcuttur. Ayrıca isterseniz bu sonuçları mail olarak almak yerine tamamen iptal edebilir veya bir dosyada da saklayabilirsiniz. Örneğin;

GET http://sitemizinadi.com/dosyadi.php > /dev/null

komutu sonuç bildirimlerini iptal etmeye yarar. Yani cron ile gerçekleştirdiğiniz işlem hiç bir şekilde size bildirilmez.
Eğer sonuçları bir dosyaya kaydetmek istiyorsanız;

GET http://sitemizinadi.com/dosyadi.php > /home/kullaniciadi/public_html/logs/cronjob.log

şeklinde komut girmeniz gerekir. Burada dikkat edilmesi gereken bu komutu yazarken > kullanırsanız, dosyaya daha önce yazılmış olan silinir ve yeni sonuç yazılır. Eğer >> şeklinde kullanırsanız, bu sefer dosyanın içerisindekiler silinmez, dosyanın en altına eklenir.

Zamanlanmış Görevler (Cronjobs) ile ilgili bahsedeceklerim şimdilik bu kadar. Eksik kalan kısımlar mevcut ise veya aklınıza takılan yerler var ise lütfen yorumlar ile belirtmekten çekinmeyin.

  13Yorumlar

  1. orhan   •  

    rastgele bir zaman ile çalıştırmak mümkün mü? misal her kullanıcı için ayrı bir cron ve rastgele zamanlarda yapılan bir işlem ?

    • Erdem Arslan   •     Yazar

      Cronu her dakika çalışacak gibi ayarlarsın. Ufak bir kod bloğu ile rasgele bir sayı üretirsin. Bunun mesela 7 ye bölümünden kalan 0 ise işlem yap dersin. O zaman senin istediğin olur 😉

  2. emre sonmez   •  

    ERDEM ABİ merhaba mail gönderen bir php sayfam bu sayfanın gönder butonunu otomatik yaptım sayfa yenilendiğinde sayfa otomatik olarak maili gönderiyor acaba bu işlem cron ile yapılabilir mi ?

    • Erdem Arslan   •     Yazar

      Sayfanın yenilenmesi yerine belirli bir zaman diliminde, diyelim ki her 10 sn de bir göndermesini istiyorsun tabiki yapılır. Cron ile belirli bir zamanda olmasını istediğin herşey olur.

      • emre sonmez   •  

        bununla 3 gündür uğraşıyorum ancak hiçbir şekilde sonuçlandıramadım.cron sayfayı dizine kaydediyor ancak yenileme yapmış olsa mail gelir çünkü sayfa her yenilendiğinde mail geliyor. İsim tescil ile çalışıyorum onlara sorduğumda cron oturumu session olarak açar bu yüzden sayfa yenileme işlemi yapmaz dedi bir çaresine de bulamadım formlarda bununla alakalı hiçbirşey yok

        • Erdem Arslan   •     Yazar

          Cron sayfa yenilemez. Çünkü web sayfası üzerinden çalışmaz, ayrı bir program olarak çalışır. Bür tür alarm gibi düşün. Saati geldiğinde işi yapar ve sonlanır. Amacın web sayfasını yenilemek mi yoksa mail göndermek mi? Web sayfasını otomatik yenilemek istiyorsan js kodlarıyla bu işi halledebilirsin crona ihtiyacın yok.

          • emre sonmez   •  

            abi aslında amacım mail göndermek ama cronda bu işi beceremedim veri tabanından çekilen verileri mail ile günlük rapor olarak göndermekti amacım… mail yöntemini yapamayınca php sayfama verileri çektim ve butonu otomatik yaptım cronun sayfayı yenileyeceğini düşündüm aslında amacım mail göndermek ben php mail ile istediğim saatte veri tabanından çektiğim verilerin o anki hali ile mail olarak gitmesini istiyorum kusura bakma çok soru sormuş gibi oldum ama ilk defa bu dende takıldım

          • Erdem Arslan   •     Yazar

            Emreciğim, mail gönderen sayfanı hazırla. Diyelim ki;
            sitem.com/mailgonder.php dosyası. Bunu çalıştırdığında istediğin maili göndersin. Cron ile bunu mesela her günün 6 saatinde, istersen 6 günde bir nasıl istersen çalıştır. Sana istediğin sonucu verecektir.

            Bunun için sadece çalışacağı saatleri belirttikten sonra GET http://sitem.com/mailgonder.php yi çalıştırmasını istemen.

  3. sabri ünal   •  

    wget ile çalıştırmayı biliyordum ama GET ile çalıştırmayı yeni öğrenmiş oldum. Teşekkürler

  4. Gökhan   •  

    Cronjob ile oluşturduğum görev çalışıyor fakat bi süre sonra kendiliğinden siliniyor bunun nedeni ne olabilir

  5. muzaffer   •  

    ee ne bu sımdı anlamadım ?
    elinizde ornek yokmu daha acıklayıcı ornek ?

    • Erdem Arslan   •     Yazar

      PHP de sistme kodlayan arkadaşlar için gerekli bir bilgidir. Normal kullanıcıların işine yarayacak bir bilgi değil. Lazım olanlar zaten ne işe yaradığını az çok biliyorlar sadece nasıl yapılacağını anlatmak için yazılmış bir yazı bu. ilgin için yine de teşekkürler.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Güvenlik Kodu * Time limit is exhausted. Please reload CAPTCHA.