Bir cron ifadesi nasıl okunur
Bir cron ifadesi, boşlukla ayrılmış beş değerdir; soldan sağa dakika, saat, ayın günü, ay, haftanın günü olarak okunur. İş, o anki zaman her alanla eşleştiğinde çalışır.
30 4 * * 1
│ │ │ │ │
│ │ │ │ └── day of week (1 = Monday)
│ │ │ └──── month (any)
│ │ └────── day of month (any)
│ └──────── hour (4am)
└─────────── minute (30)
Bu ifade "her pazartesi 04:30'da" diye okunur.
Beş alan
| # | Alan | İzin verilen değerler | Notlar |
|---|---|---|---|
| 1 | Dakika | 0 ile 59 | |
| 2 | Saat | 0 ile 23 | 24 saatlik gösterim, 0 gece yarısıdır |
| 3 | Ayın günü | 1 ile 31 | |
| 4 | Ay | 1 ile 12 ya da JAN ile DEC | |
| 5 | Haftanın günü | 0 ile 6 ya da SUN ile SAT | 0 pazardır ve çoğu cron uygulaması 7'yi de kabul eder |
Bazı zamanlayıcılar farklı bir biçim kullanır. Birçok Java yazılımında kullanılan Quartz, saniyeyi başa koyar, isteğe bağlı bir yıl ekler ve hafta günlerini pazardan başlayarak 1 ile 7 arasında numaralandırır. Bir ifadenin altı ya da yedi alanı varsa, okumanıza güvenmeden önce hangi sistem için yazıldığını denetleyin.
İşleçler
Dört tanedir ve tek bir alanın içinde birleşebilirler.
| Simge | Adı | Örnek | Anlamı |
|---|---|---|---|
* | Herhangi | * * * * * | Her günün her dakikası |
, | Liste | 0 9,13,17 * * * | 09:00, 13:00 ve 17:00'de |
- | Aralık | 0 9-17 * * * | 09:00 ile 17:00 arasında, ikisi de dahil, saat başı |
/ | Adım | */15 * * * * | :00, :15, :30 ve :45'te |
Adım her zaman bir aralığa uygulanır. Dakika alanındaki */15, "0'dan başla, 59'a kadar her 15. değeri al" demektir. Açıkça yazılmış bir aralığı da adımlayabilirsiniz: 5-30/10 ifadesi 5, 15 ve 25 verir, sonra durur çünkü 35 sonun ötesindedir.
Adımlar "şu andan itibaren her 15 dakikada bir" demek değildir; saatten sabit değerler seçerler. */40 :00 ve :40'ta tetiklenir, sonra bir sonraki saatin :00'ı için yalnızca 20 dakika bekler, çünkü sayım her saat yeniden başlar. Listeler aralık ve adım içerebilir, dolayısıyla 0 0-6/2,12,18-23 * * * geçerli bir saat alanıdır.
Adlar ve kısayollar
Ay ve haftanın günü alanları üç harfli adları kabul eder ve harf durumu fark etmez, dolayısıyla JAN, jan ve Jan aynıdır. Klasik crontab belgeleri ad aralıklarına ve ad listelerine izin verilmediğini söyler, gerçi birçok modern uygulama MON-FRI ifadesini kabul eder. İşinizi neyin çalıştırdığından emin değilseniz sayı kullanın: 1-5 her yerde tek anlamlıdır.
Birkaç kısayol beş alanlık ifadenin tamamının yerini alır:
| Kısayol | Karşılığı | Ne zaman çalışır |
|---|---|---|
@yearly ya da @annually | 0 0 1 1 * | 1 Ocak, gece yarısı |
@monthly | 0 0 1 * * | Ayın 1'i, gece yarısı |
@weekly | 0 0 * * 0 | Pazar günü gece yarısı |
@daily ya da @midnight | 0 0 * * * | Her gün gece yarısı |
@hourly | 0 * * * * | Saat başı |
Bir de @reboot vardır, ama bu bir zamanlama değildir: işi, cron'un kendisi başladığında bir kez çalıştırır.
Ayın günü ve haftanın günü tuzağı
Isıran madde budur. Hem ayın günü alanı hem de haftanın günü alanı kısıtlandığında, yani ikisi de * olmadığında, cron işi ikisi birden eşleştiğinde değil, herhangi biri eşleştiğinde çalıştırır.
0 0 13 * 5
Bunu "13'üne denk gelen cuma günü gece yarısı" diye okuyabilirsiniz. Gerçekte "her ayın 13'ünde gece yarısı ve ayrıca her cuma gece yarısı" demektir: yılda bir iki kez yerine altmıştan fazla çalışma.
Beklediğiniz VE davranışı yalnızca iki alandan biri * olduğunda geçerlidir. Yani 0 0 * * 5 her cumadır, 0 0 13 * * her ayın 13'üdür ve ikisi de gayet normaldir. VEYA davranışını tetikleyen şey ikisini birden kısıtlamaktır.
Beş alanla "13'üne denk gelen cuma" ifadesini yazmanın standart bir yolu yoktur. Alışılmış çözüm, her ayın 13'üne zamanlamak ve işin herhangi bir şey yapmadan önce haftanın gününü denetlemesini sağlamaktır.
Buna bağlı bir incelik: bazı uygulamalar bir alanın kısıtlı olup olmadığına, harfi harfine * ile başlayıp başlamadığına bakarak karar verir. Bunlarda haftanın günü alanındaki 0-6, her günü kapsamasına rağmen kısıtlı sayılır ve VEYA davranışını sessizce devreye sokar. "Herhangi" demek istediğinizde * kullanın.
Denetlemeye değer hatalar
* */2 * * *ifadesi her iki saatte bir, o saatin her dakikası çalışır: günde 720 çalışma. Sizin istediğiniz0 */2 * * *idi, o da 12 eder.- Eksik bir dakika alanı her şeyi bir sola kaydırır ve genellikle yine de ayrıştırılır; böylece tümüyle yanlış bir zamanda geçerli bir zamanlamanız olur.
0 0 31 * *ifadesi 31'i olmayan ayları sessizce atlar.- Zamanlayıcı bir saat dilimi ayarlamanıza izin vermiyorsa cron, sistemin ya da kullanıcının saat dilimini kullanır. Yaz saati uygulaması için saatler kaydığında, atlanan saate düşen bir iş hiç çalışmayabilir, tekrarlanan saate düşen bir iş ise uygulamaya bağlı olarak iki kez çalışabilir. Günde bir kez çalışması gereken işler, en güvenli biçimde kaymanın denk geldiği gecenin küçük saatlerinden uzağa zamanlanır.
Kuşkuya düştüğünüzde ifadeyi bir cümle olarak geri okuyun, sonra gerçekte tetikleneceği ilk birkaç zamanı denetleyin. O tarihler tarif ettiğiniz şey değilse yanlış olan okumanız değil ifadedir.