Crontab cheat sheet: 50+ cron ifadesi, sözdizimi ve modern scheduler rehberi
Bir cron ifadesi beş alandan oluşur (dakika, saat, ayın günü, ay, haftanın günü) ve sonunda çalıştırılacak komut gelir. Bu dilbilgisi 1979’dan beri Unix zamanlamasını yürütüyor; bugün Kubernetes CronJob, GitHub Actions, AWS EventBridge ve Vercel cron tetikleyicileri de aynı dilbilgisini kullanıyor.
Bir Linux görevi, bir Kubernetes CronJob’ı, bir GitHub Actions tetikleyicisi yazıyorsanız ya da beş dakikalık bir işin neden saatte bir tetiklendiğini ayıklıyorsanız: kopyala-yapıştır ifadeler için Hızlı Referans Tablosu’na, alan kurallarına geçmek için Sözdizimi Çözümlemesi bölümüne bakın. İfadeleri doğrulamak için Crontab Oluşturucu’yu — tarayıcınızda çalışan privacy-first crontab guru alternatifi — açın.
Cron ifadesi hızlı referans tablosu
Gerçek zamanlama ihtiyaçlarının yaklaşık %90’ını karşılayan otuz ifade. Her biri geçerli POSIX beş alanlı cron; crontab -e ekranına, bir Kubernetes schedule: alanına ya da bir GitHub Actions cron: alanına doğrudan yapıştırabilirsiniz.
| Zamanlama | Cron ifadesi | Türkçe karşılığı |
|---|---|---|
| Her dakika | * * * * * | her dakika, tüm gün, her gün |
| Her 5 dakikada bir | */5 * * * * | dakika 0, 5, 10, …, 55 |
| Her 15 dakikada bir | */15 * * * * | dakika 0, 15, 30, 45 |
| Her 30 dakikada bir | */30 * * * * | dakika 0 ve 30 |
| Her saat | 0 * * * * | her saatin başında |
| Her 2 saatte bir | 0 */2 * * * | saat 0, 2, 4, …, 22 |
| Her 6 saatte bir | 0 */6 * * * | saat 0, 6, 12, 18 |
| Günde iki kez (09:00 + 21:00) | 0 9,21 * * * | 9 ve 21’in dakika 0’ı |
| Hafta içi her gün 09:00 | 0 9 * * 1-5 | Pzt-Cum 09:00 |
| Hafta sonu 09:00 | 0 9 * * 0,6 | Cmt ve Paz 09:00 |
| Her gün gece yarısı | 0 0 * * * | her gün 00:00 |
| Her gün 02:30 | 30 2 * * * | düşük trafikli batch penceresi |
| Her Pazartesi 09:00 | 0 9 * * 1 | Pazartesileri 09:00 |
| Her Cuma 17:00 | 0 17 * * 5 | Cumaları 17:00 |
| Her Pazar gece yarısı | 0 0 * * 0 | @weekly ile eşdeğer |
| Ayın 1’i gece yarısı | 0 0 1 * * | ayın 1’i 00:00, @monthly ile eşdeğer |
| Her ayın 15’i öğlen | 0 12 15 * * | ay ortası bordro penceresi |
| Ayın son günü kontrolü (sarmalayıcı) | 0 0 28-31 * * + script | tarih kontrolü gerekir |
| Çeyreklik (Oca/Nis/Tem/Eki ayının 1’i) | 0 0 1 JAN,APR,JUL,OCT * | her çeyreğin ilk günü |
| Yıllık (1 Ocak) | 0 0 1 1 * veya @yearly | yılbaşı gece yarısı |
| Hafta içi 9-17 arası her 5 dakikada | */5 9-17 * * 1-5 | mesai içi yoklama |
| Hafta sonu her 30 dakikada bir | */30 * * * 0,6 | Cmt/Paz izlemesi |
| Saatte iki kez, 15 ve 45 | 15,45 * * * * | :00 izdihamından kaçınma |
| İlk Pazartesi (sarmalayıcı) | 0 9 1-7 * 1 + AND kontrolü | sarmalayıcı gerekir (aşağıya bakın) |
| Makrolar | @hourly @daily @weekly @monthly @yearly | standart dışı ama yaygın desteklenir |
| Yalnızca yeniden başlatmada | @reboot | standart dışı, yalnızca vixie cron |
Bu ifadelerden herhangi birini Crontab Oluşturucu’ya yapıştırın; sonraki beş tetikleme önizlemesi, devreye almadan önce hızlı bir kontrol verir.
Cron sözdizimi çözümlemesi — 5 alan
Bir cron ifadesi, boşlukla ayrılmış beş alan ve ardından bir komuttan oluşur. Her alan, zamanlamanın bir dilimini denetler. Bu rehberdeki her scheduler için cron sözdiziminin özü budur.
┌──────────── minute (0 - 59)
│ ┌────────── hour (0 - 23)
│ │ ┌──────── day-of-month (1 - 31)
│ │ │ ┌────── month (1 - 12 or JAN-DEC)
│ │ │ │ ┌──── day-of-week (0 - 6 or SUN-SAT; 0 and 7 both mean Sunday)
│ │ │ │ │
* * * * * command-to-run
Hatırlatıcı: “Dakika, Saat, Gün, Ay, Hafta” sırasıyla, soldan sağa, en küçük birimden en büyüğe.
Alan alan izin verilen değerler
| Alan | Aralık | Takma adlar | Notlar |
|---|---|---|---|
| Dakika | 0-59 | yok | 0 “saatin tam başı” anlamına gelir |
| Saat | 0-23 | yok | 24 saatlik düzen; 0 gece yarısı, 12 öğlen |
| Ayın günü | 1-31 | yok | bir ay için geçersiz günler sessizce hiç tetiklenmez (31 Şubat) |
| Ay | 1-12 | JAN, FEB, MAR, …, DEC | büyük-küçük harfe duyarsız |
| Haftanın günü | 0-7 | SUN, MON, TUE, …, SAT | hem 0 hem 7 Pazar anlamına gelir |
Operatörlerin detayı
Beş operatör her standart cron ifadesini kapsar:
| Operatör | Anlamı | Örnek | Genişletmesi |
|---|---|---|---|
* | herhangi bir değer | * * * * * | her dakika |
, | liste | 0 9,12,17 * * * | 09:00, 12:00, 17:00 |
- | dahil aralık | 0 9-17 * * * | 09:00 ile 17:00 arası her saat |
/ | adım | */15 * * * * | dakika 0, 15, 30, 45 |
| karma | bileşik | 0 9-12,14-17 * * * | sabah + öğleden sonra, öğle arası atlanır |
Adım operatörü ayrı bir dikkat ister. */N, geçerli zamana değil, alanın en küçük değerine sabitlenir. */15, “şu andan itibaren her 15 dakikada” değil, “her saatin 0, 15, 30 ve 45’inci dakikası” anlamına gelir. 12:03’te kaydederseniz sonraki çalışma 12:15’tir. Joker olmayan bir taban verirseniz, 5/15 “5’ten başla, sonra her 15 dakikada bir” anlamına gelir: dakika 5, 20, 35, 50.
Adlandırılmış aylar ve haftanın günleri
Ayları ve haftanın günlerini ad olarak, büyük-küçük harfe duyarsız biçimde yazın:
0 0 1 JAN,APR,JUL,OCT * # first of each quarter
0 9 * * MON-FRI # weekdays at 9 AM
0 17 * * FRI # Friday at 5 PM
Adlar kod incelemesinde daha okunaklıdır; sayısal biçimler biraz daha taşınabilirdir. Her projede tek bir stilde karar kılın.
Standart dışı makrolar: @reboot, @daily ve arkadaşları
Çoğu cron implementasyonu altı kısayol makrosunu kabul eder:
| Makro | Karşılığı | Anlamı |
|---|---|---|
@yearly / @annually | 0 0 1 1 * | yılda bir, 1 Ocak gece yarısı |
@monthly | 0 0 1 * * | her ayın 1’i gece yarısı |
@weekly | 0 0 * * 0 | her Pazar gece yarısı |
@daily / @midnight | 0 0 * * * | her gün gece yarısı |
@hourly | 0 * * * * | her saatin başında |
@reboot | (özel) | cron daemon’u başladığında bir kez |
Bu makrolar standart dışıdır: vixie cron ve cronie destekler, ama Kubernetes CronJob, GitHub Actions ve AWS EventBridge desteklemez. Taşınabilir ifadeler için beş alanlı biçimi yazın. @reboot, cron daemon’unun PID 1 olmadığı konteynerlerde nadiren çalışır.
50+ kopyala-yapıştır cron ifadesi (kullanım senaryosuna göre gruplandırılmış)
Hızlı Referans Tablosu, sık karşılaşılan vakaları kapsar. Bu bölüm altı kovaya inerek daha yoğun cron iş örnekleri verir.
Her N dakikada bir
* * * * * # every minute
*/2 * * * * # every 2 minutes
*/5 * * * * # every 5 minutes — the cron expression every 5 minutes case
*/10 * * * * # every 10 minutes
*/15 * * * * # every 15 minutes
*/30 * * * * # every 30 minutes
0,30 * * * * # explicit minutes 0 and 30 (same as */30)
*/45 * * * * # WARNING: fires at 0 and 45 only, then wraps
*/45 sık görülen bir tuzaktır: dakika 0-59 arasında olduğu için 0 ve 45’te tetiklenir, sonra bir sonraki saate sarar. Gerçek 45 dakikalık bir kadans için harici bir worker gerekir.
Saatlik varyantlar
0 * * * * # every hour at :00
30 * * * * # every hour at :30
0 */2 * * * # every 2 hours, even hour
0 */6 * * * # every 6 hours
0 */12 * * * # twice a day at 00:00 and 12:00
15 */2 * * * # every 2 hours, offset by 15 min (avoids :00 spike)
Belirli saatlerde günlük
0 0 * * * # midnight (= @daily / @midnight)
30 2 * * * # 02:30 — low-traffic batch window
0 9 * * * # 09:00
45 23 * * * # 23:45 — end-of-day rollups
0 9,12,17 * * * # three times daily
0 9-17 * * * # every hour from 09:00 through 17:00
Haftalık zamanlamalar
0 9 * * 1-5 # weekdays at 9 AM
0 9 * * 0,6 # weekends at 9 AM
0 18 * * 5 # Fridays at 6 PM
0 0 * * 0 # Sunday at midnight (= @weekly)
0 9 * * MON,WED,FRI # Mon/Wed/Fri at 9 AM
*/30 9-17 * * 1-5 # every 30 min, business hours, weekdays
Aylık ve çeyreklik
0 0 1 * * # 1st of month at midnight (= @monthly)
0 0 15 * * # 15th — payroll window
0 0 1,15 * * # 1st and 15th — semi-monthly
0 0 1 */3 * # quarterly: first of Jan, Apr, Jul, Oct
0 0 1 JAN,APR,JUL,OCT * # same, named months
0 0 28-31 * * # last few days — pair with a date-check wrapper
Ayın son gününün doğal bir POSIX ifadesi yoktur. date -d tomorrow +%d = 01 koşulunu denetleyen bir sarmalayıcı çalıştırın ya da yerli desteği olan bir scheduler kullanın (Quartz’ta L vardır; Kubernetes’te yoktur).
Yıllık ve makro kısayollar
0 0 1 1 * # Jan 1 at midnight (= @yearly / @annually)
0 0 25 12 * # Christmas at midnight
@yearly # = 0 0 1 1 *
@monthly # = 0 0 1 * *
@weekly # = 0 0 * * 0
@daily # = 0 0 * * *
@hourly # = 0 * * * *
@reboot # special: once on daemon start (vixie cron only)
Bu ifadelerin tamamı Crontab Oluşturucu’ya yapıştırıldığında sonraki beş tetikleme önizlemesi sunar; devreye almadan önce ucuz bir duman testi olur.
Cron, systemd timer’ları ve bulut scheduler’ları karşılaştırması — karar matrisi
Cron varsayılan seçimdir, ama her zaman en iyisi değildir. En yaygın yedi scheduler karşılaştırması; cron ile systemd timer arasındaki kararlar, Kubernetes CronJob ile Vercel cron job seçimi ya da crontab’tan yönetilen buluta göç için faydalıdır.
| Özellik | vixie cron | systemd timer | K8s CronJob | GHA schedule | AWS EventBridge | Vercel Cron | Cloudflare Workers |
|---|---|---|---|---|---|---|---|
| Alan sözdizimi | 5 alan POSIX | OnCalendar spec | 5 alan POSIX + timeZone | 5 alan POSIX | 6 alan Quartz, ? ile | 5 alan POSIX | 5 alan POSIX |
| Minimum aralık | 1 dakika | 1 saniye | 1 dakika | best-effort, ≥15 dk önerilir | 1 dakika | 1 dakika (Pro plan) | 1 dakika |
| Açık zaman dilimi | CRON_TZ= | Persistent=true | spec.timeZone (1.27+) | yalnız UTC | ScheduleExpressionTimezone | yalnız UTC | yalnız UTC |
| Kaçırılan çalışma kurtarma | hayır (anacron kullanın) | evet (Persistent=true) | evet (startingDeadlineSeconds) | hayır | evet | hayır | hayır |
| Yeniden deneme / backoff | hayır | kısmen | evet (backoffLimit) | hatada yeniden deneme | evet | hayır | evet |
| Eşzamanlılık denetimi | hayır (flock kullanın) | kısmen | evet (concurrencyPolicy) | hayır | hayır | hayır | hayır |
@reboot desteği | evet | evet (OnBootSec= ile) | hayır | hayır | hayır | hayır | hayır |
systemd timer’lar — cron’a tercih edilme zamanı
systemd tabanlı Linux’ta timer’lar ciddi bir alternatiftir: okunaklı takvim sözdizimi, journal entegrasyonu, kaçırılan çalışma kurtarma. Bir timer ve eşleşen bir service:
# daily-report.timer
[Unit]
Description=Run daily report at 9 AM
[Timer]
OnCalendar=*-*-* 09:00:00
Persistent=true
Unit=daily-report.service
[Install]
WantedBy=timers.target
# daily-report.service
[Unit]
Description=Daily report job
[Service]
Type=oneshot
ExecStart=/usr/local/bin/daily-report.sh
User=reporter
systemctl enable --now daily-report.timer ile etkinleştirin. Önemli özelliği Persistent=true: makine 09:00’da kapalıysa, timer açılır açılmaz tetiklenir. Vixie cron’un anacron olmadan eşdeğeri yoktur. Servis sıkılaştırması için güvenlik en iyi uygulamaları yazımıza bakın.
Kubernetes CronJob
Kubernetes, POSIX zamanlamasını eşzamanlılık, geçmiş ve açık zaman dilimi için ilkellerle sarar:
apiVersion: batch/v1
kind: CronJob
metadata:
name: nightly-report
spec:
schedule: "0 2 * * *"
timeZone: "America/New_York" # Kubernetes 1.27+
concurrencyPolicy: Forbid # never run two at once
startingDeadlineSeconds: 300 # skip if delayed >5 min
jobTemplate:
spec:
backoffLimit: 2
template:
spec:
restartPolicy: OnFailure
containers:
- name: reporter
image: reporter:1.4.0
command: ["/usr/local/bin/report.sh"]
concurrencyPolicy: Forbid flock eşdeğeridir. Bu olmadan, uzun süren bir iş ardılının üstüne yığılır. Tüm parametreler için aşağıdaki alan referansı bölümüne bakın.
GitHub Actions schedule uyarıları
GitHub Actions standart beş alanlı POSIX cron’u kabul eder:
on:
schedule:
- cron: '0 9 * * 1-5' # weekdays at 9 AM UTC
Best-effort: GitHub runner’larında yük yüksekken işler dakikalar geç başlayabilir ya da tamamen atlanabilir. On beş dakikadan kısa aralıklardan kaçının. Zaman dilimi ayarı yok; her zaman UTC çalışır.
AWS EventBridge — Quartz tarzı altı alanlı
AWS EventBridge, altı alanlı ve gün yuvalarından birinde zorunlu ? içeren Quartz lezzetinde bir cron kullanır:
cron(0 9 * * ? *)
Alan sırası: Minutes Hours Day-of-month Month Day-of-week Year. Bir gün alanı kısıtlandığında diğeri ? olmalıdır (Quartz’ın POSIX OR belirsizliğini çözme yöntemi). Linux crontab’tan doğrudan kopya doğrulamadan geçmez.
Vercel Cron, Cloudflare Workers, Render Cron Jobs
Daha yeni serverless platformlar beş alanlı POSIX üzerinde standartlaşır. Bir Vercel cron job, vercel.json içinde { "crons": [{ "path": "/api/cron/nightly", "schedule": "0 2 * * *" }] } olarak tanımlanır. Cloudflare Workers Cron Triggers wrangler.toml kullanır:
[triggers]
crons = ["*/15 * * * *", "0 9 * * 1-5"]
Render render.yaml kullanır. Üçü de UTC çalışır, zamanlama başına zaman dilimi geçersiz kılma sunmaz. Daha en başından UTC üzerinden tasarlayın.
7 cron hata ayıklama tuzağı (ve nasıl yakalanır)
“Cron işim çalışmıyor” raporlarının çoğunun kök nedeni şu yedi maddeden biridir. Scheduler’ı suçlamadan önce bu listeyi geçin.
Tuzak 1: PATH minimaldir
Cron, işleri minimal bir $PATH ile başlatır; tipik olarak /usr/bin:/bin. Etkileşimli shell’inizde /usr/local/bin, ~/.cargo/bin ve bir düzine .bashrc girdisi vardır. Hiçbiri cron’da yoktur. Cron hata ayıklama PATH ortam sorunlarının bir numaralı kaynağı budur.
Belirti: node: command not found. Çözüm: crontab’ın en üstünde PATH ayarlayın ya da mutlak yollar kullanın.
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/opt/homebrew/bin
*/15 * * * * /usr/local/bin/poll-api.sh
0 9 * * * /home/deploy/.cargo/bin/my-rust-cli
Tuzak 2: stdout ve stderr sessizce kaybolur
Varsayılan olarak cron çıktısı kimsenin okumadığı bir mail spool’una gider. İş sessizce başarısız olur. Her iki akışı da yeniden yönlendirin:
*/15 * * * * /usr/local/bin/job.sh >> /var/log/job.log 2>&1
JSON çıktısı için jq üzerinden boru kurun; log satırı çıkarımı için regex cheat sheet yazımıza bakın. systemd timer’larında journalctl -u your-timer.service çıktıyı yakalar.
Tuzak 3: dev ve prod arasında zaman dilimi kayması
Laptop’unuzda New York’tasınız ve 0 9 * * * yazdınız, 09:00 Doğu beklersiniz. Sunucu UTC çalışıyor. Cron 09:00 UTC’de (Doğu saatiyle 04:00) kimse fark etmeden tetiklenir. Çözüm: sunucuları UTC’ye ayarlayın ve zamanlamaları UTC üzerinden yazın ya da zaman dilimini açıkça sabitleyin.
CRON_TZ=America/New_York
0 9 * * * /usr/local/bin/morning-report.sh
CRON_TZ, vixie cron 3.0+‘ta çalışır; Kubernetes 1.27+ spec.timeZone sunar; AWS EventBridge ScheduleExpressionTimezone sunar; GitHub Actions ise her zaman UTC kullanır. UTC, DST ve epoch hesabı için Unix zaman damgası rehberi yazımıza bakın.
Tuzak 4: Komutlarda kaçırılmamış %
Cron, kaçırılmamış % karakterini yeni satır olarak yorumlar; satırın geri kalanı komuta stdin olarak iletilir. date +"%Y-%m-%d" bu yüzden bozulur. Her % karakterini \% olarak kaçırın ya da mantığı bir script’e taşıyın:
0 0 * * * echo "Run at $(date +"\%Y-\%m-\%d")" >> /tmp/log
Tuzak 5: Çakışan çalışmalar
Zaman zaman yedi dakika süren bir */5 * * * * işi, öncekisi bitmeden bir sonraki örneğini başlatır. İki kopya aynı satır, kilit dosyası ve API kotası için kapışır. flock ile serileştirin:
*/5 * * * * flock -n /tmp/job.lock /usr/local/bin/job.sh
-n, kilit tutuluyorsa hemen çıkar. Kubernetes için concurrencyPolicy: Forbid ayarlayın. Kilit dosyası izinleri önemlidir; güvenlik en iyi uygulamaları yazımıza bakın.
Tuzak 6: Konteynerlerde @reboot
@reboot, cron daemon’u başladığında bir kez çalışır. Bir VM’de bu boot’a denk gelir. Bir konteynerde cron daemon’u genellikle PID 1 değildir ve hiç çalışmayabilir. Konteynerlerde @reboot kullanmayın; boot’ta bir kez çalışacak mantığı entrypoint’inize ya da bir init container’a koyun.
Tuzak 7: POSIX ayın günü / haftanın günü OR semantiği
En pahalıya patlayan cron tuzağı. POSIX kuralı: hem ayın günü hem haftanın günü kısıtlandığında (hiçbiri * değilse), zamanlama her ikisi de eşleştiğinde tetiklenir.
0 0 1 * 5 görünüşte “gece yarısı 1’inde, yalnız Cuma günleri” gibidir; ama 1’inde VE her Cuma tetiklenir: ayda altı ila on fazladan tetikleme.
# WRONG: looks like "1st of the month, only if Friday"
0 0 1 * 5
# RIGHT: pick one constraint
0 0 1 * * # every 1st of the month
0 0 * * 5 # every Friday
# AND semantics need a wrapper
0 0 1-7 * 5 [ "$(date +\%u)" = "5" ] && /script # first Friday only
Şüpheli ifadeleri Crontab Oluşturucu’ya yapıştırın; sonraki çalışma önizlemesi OR tuzağını gözle görünür hale getirir.
Modern scheduler’lar — cron NE ZAMAN kullanılmaz
Cron, “bu komutu kabaca şu saatte, sabit bir kadansla çalıştır” için doğrudur. Yakındaki birkaç problem için ise yanlıştır:
- Bağımlılığı olan akışlar (önce A, A başarılıysa sonra B) → Airflow, Prefect, Dagster.
- Yeniden deneme, üstel backoff, dead-letter kuyruğu → Temporal, AWS Step Functions, Sidekiq.
- Dakika altı aralıklar → yineleme arasında uyuyan uzun ömürlü bir worker.
- Saniye hassasiyetinde zamanlama → ayrılmış bir daemon; yönetilen scheduler’lar tam zamanlama vaadi vermez.
- Olay güdümlü iş → webhook, mesaj kuyruğu, change-data-capture akışları.
Cron ortadan kalkmaz: Airflow, Step Functions ve Sidekiq, akışlarının girişi için cron ifadelerini kabul eder. Beş alanlı dilbilgisi yeniden kullanılabilir.
Kubernetes CronJob alan referansı
Yukarıdaki karar matrisi minimal bir CronJob gösterdi. Kubernetes CronJob sözdizimi için tam alan referansı:
| Alan | Varsayılan | Ne yapar |
|---|---|---|
schedule | zorunlu | POSIX 5 alanlı cron ifadesi |
timeZone | controller TZ | açık zaman dilimi (1.27+); IANA adlarını kullanın |
concurrencyPolicy | Allow | Forbid önceki etkinken yeni çalışmaları atlar; Replace öncekini iptal eder |
startingDeadlineSeconds | sınırsız | bundan daha gecikmişse atla |
successfulJobsHistoryLimit | 3 | tutulacak başarılı Job sayısı |
failedJobsHistoryLimit | 1 | tutulacak başarısız Job sayısı |
suspend | false | silmeden duraklat |
backoffLimit | 6 | Job Failed olarak işaretlenmeden önceki Pod yeniden deneme sayısı |
activeDeadlineSeconds | yok | Pod çalışma süresinde sert üst sınır |
ttlSecondsAfterFinished | yok | Job’u bu kadar saniye sonra otomatik silsin |
İki sık tuzak: timeZone’u unutmak, zamanlamayı kube-controller-manager’ın host zaman dilimine bağlar (yönetilen Kubernetes’te öngörülemez); bir dakikalık zamanlamada varsayılan successfulJobsHistoryLimit: 3, ttlSecondsAfterFinished ayarlanmadığı takdirde dakikada üç Job nesnesi biriktirir.
Platformlar arası cron eşdeğerleri
macOS launchd: Apple, cron yerine launchd önerir. Bir launchd işi, ~/Library/LaunchAgents/ içinde bir .plist dosyasıdır:
<plist version="1.0"><dict>
<key>Label</key><string>com.example.daily</string>
<key>ProgramArguments</key><array><string>/usr/local/bin/daily.sh</string></array>
<key>StartCalendarInterval</key>
<dict><key>Hour</key><integer>9</integer><key>Minute</key><integer>0</integer></dict>
</dict></plist>
launchctl load ~/Library/LaunchAgents/com.example.daily.plist ile yükleyin. Cron’un aksine launchd, uyku/uyanma sonrasında kaçırılan çalışmaları yakalar.
Windows Task Scheduler, schtasks kullanır:
schtasks /create /tn "DailyReport" /tr "C:\scripts\report.bat" /sc DAILY /st 09:00
schtasks /create /tn "EveryFifteen" /tr "C:\scripts\poll.bat" /sc MINUTE /mo 15
WSL’de yerli Linux cron çalışır ama oturum bittiğinde durur; her zaman açık WSL işlerini başlatmak için Task Scheduler’ı kullanın.
Docker konteynerlerinde cron: Çoğu slim imaj (alpine, debian-slim, distroless) cron daemon’u olmadan gelir. cronie ya da busybox-cron kurun ve tini ya da s6-overlay ile PID 1 olarak çalıştırın; veya çoğu durumda daha iyi seçenek olan Kubernetes CronJob’a yönelin.
İleri ipuçları ve desenler
Ayın son günü
Cron’da doğal bir “son gün” operatörü yoktur. 28-31 penceresinde her gün çalıştırın ve yarının 1 olup olmadığını kontrol edin:
0 23 28-31 * * [ "$(date -d tomorrow +\%d)" = "01" ] && /usr/local/bin/eom.sh
Ayın N’inci günü
“İlk Pazartesi” aynı sarmalayıcı desenini kullanır; 1-7 günleriyle kısıtlayın, sonra haftanın gününü kontrol edin:
0 9 1-7 * * [ "$(date +\%u)" = "1" ] && /usr/local/bin/first-monday.sh
“Son Cuma” için 25-31 günleri artı haftanın günü kontrolünü kullanın.
Yükü dağıtmak için rastgele kayma
Birçok makine aynı cron’u çalıştırdığında, 0 0 * * * UTC gece yarısında bir thundering herd üretir. Rastgele bir gecikme serpiştirin:
RANDOM_DELAY=10 # cronie / anacron, in minutes
0 0 * * * /usr/local/bin/job.sh
0 0 * * * sleep $((RANDOM \% 600)); /usr/local/bin/job.sh # portable
Kalp atışı izleme
Cron sessizce başarısız olur. Dead-man’s-switch deseni: iş, her başarılı çalışmadan sonra bir izleme servisini pingler; servis, beklenen ping gelmediğinde uyarır. Healthchecks.io, Cronitor ve Dead Man’s Snitch’in ücretsiz katmanları vardır.
*/15 * * * * /usr/local/bin/job.sh && curl -fsS --retry 3 https://hc-ping.com/your-uuid
Yanıt kodlarına göre dallanan izleme mantığı için (200 sağlıklı, 429 rate-limited, 503 bozulmuş) HTTP durum kodları cheat sheet yazımıza bakın.
Idempotency, scheduler’ın değil işin bir özelliğidir
Cron’da yeniden deneme, kaçırılan çalışma kurtarma ya da eşzamanlılık denetimi yoktur. Güvenilir çözüm, işin kendisini birden fazla kez çalıştırılabilir biçimde tasarlamaktır. “Bugünkü raporu 09:00’da gönder” yerine, “bugünkü rapor henüz gönderilmediyse gönder” olarak tasarlayın; kaçırılan çalışmalar, çiftler ve elle yetiştirmeler aynı duruma yakınsar.
SSS
*/5 * * * * gerçekten her 5 dakikada bir mi?
Tam olarak değil — */5 * * * *, dakika 0’a sabitlidir, “şu andan itibaren her 5 dakikada” değil. Her saatin dakika 0, 5, 10, …, 55’inde tetiklenir. */N adımı, geçerli zamana değil, alanın en küçük değerine görelidir. 12:03’te kaydederseniz sonraki çalışma 12:05’tir, 12:08 değil.
Cron’da 0 0 * * * ne anlama gelir?
0 0 * * *, sunucunun yerel zaman diliminde her gün gece yarısı (00:00) anlamına gelir. Alanlar: dakika 0, saat 0, herhangi bir ayın günü, herhangi bir ay, herhangi bir haftanın günü. @daily ya da @midnight makrolarıyla eşdeğerdir. Zaman dilimini sabitlemek için crontab’ın en üstüne CRON_TZ=America/New_York ekleyin.
Cron işini her 30 saniyede bir nasıl çalıştırırım?
Standart POSIX cron ile yapamazsınız: minimum granülerlik bir dakikadır. Geçici çözümler: birinde sleep 30 && olan iki şaşırtmalı * * * * * işi; OnCalendar=*:*:0/30 ile bir systemd timer; ya da yineleme arasında uyuyan uzun ömürlü bir worker. Genellikle son seçenek tercih edilir.
Cron varsayılan olarak hangi zaman dilimini kullanır?
Sunucunun yerel sistem zaman dilimini (/etc/timezone ya da TZ ortam değişkeni). UTC sunucudaki 09:00 cron’u, ABD Doğu saatiyle 04:00’te tetiklenir. Çözüm: crontab’ın en üstünde CRON_TZ= ayarlayın ya da sunucuları UTC’ye ayarlayıp zamanlamaları UTC üzerinden tasarlayın. GitHub Actions her zaman UTC kullanır; Kubernetes 1.27+ spec.timeZone’u destekler.
Cron işim neden çalışmıyor?
Cron işiniz çalışmıyorsa, sırayla kontrol edin: cron daemon’u çalışıyor mu (systemctl status cron); crontab’ta $PATH ayarlı mı; stderr yakalanıyor mu (>> log 2>&1); kullanıcının crontab’ı yüklü mü (crontab -l); komutlarda % kaçırılmış mı; zaman dilimi beklediğiniz gibi mi. “Çalışmıyor” raporlarının çoğunda ikinci ya da üçüncü madde devrededir.
Kubernetes CronJob sözdizimi Linux cron ile aynı mı?
Zamanlama alanı için evet: ikisi de POSIX beş alanlı cron kullanır. Kubernetes, spec.timeZone (1.27+), çakışma denetimi için concurrencyPolicy, kaçırılan çalışma kurtarma için startingDeadlineSeconds ve duraklatmak için suspend: true ekler. Linux cron’da bunların hiçbiri yoktur; bunun yerine flock ve anacron’a uzanın.
@reboot ile @daily arasındaki fark nedir?
@daily, 0 0 * * * için bir makrodur: sabit bir zamanlama üzerinden her gün gece yarısı. @reboot, yinelenen zamanlama olmadan, cron daemon’u başladığında bir kez çalışır. @reboot, vixie cron ve cronie tarafından desteklenir, ancak Kubernetes CronJob, GitHub Actions ya da AWS EventBridge tarafından desteklenmez. Konteynerlerde @reboot nadiren tetiklenir.
cron ile crontab arasındaki fark nedir?
cron, zamanlanmış işleri çalıştıran arka plan daemon’udur; crontab ise bu işleri listeleyen dosyadır (ve dosyayı düzenlemek için kullanılan crontab komutudur). Daemon, her kullanıcının crontab’ını düzenli aralıklarla okur ve çalıştırma zamanı cron ifadesiyle eşleşen komutları çalıştırır. Kısacası: cron motor, crontab tariftir.