Skip to content
Bloga Dönün
Eğitimler

Crontab cheat sheet: 50+ cron ifadesi ve modern scheduler rehberi

50+ kopyala-yapıştır cron ifadesi, alan alan sözdizimi, gün/hafta OR tuzağı, zaman dilimi sorunları ve Kubernetes/GitHub/AWS karşılaştırması.

13 dakika okuma

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.

ZamanlamaCron ifadesiTü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 saat0 * * * *her saatin başında
Her 2 saatte bir0 */2 * * *saat 0, 2, 4, …, 22
Her 6 saatte bir0 */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:000 9 * * 1-5Pzt-Cum 09:00
Hafta sonu 09:000 9 * * 0,6Cmt ve Paz 09:00
Her gün gece yarısı0 0 * * *her gün 00:00
Her gün 02:3030 2 * * *düşük trafikli batch penceresi
Her Pazartesi 09:000 9 * * 1Pazartesileri 09:00
Her Cuma 17:000 17 * * 5Cumaları 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 öğlen0 12 15 * *ay ortası bordro penceresi
Ayın son günü kontrolü (sarmalayıcı)0 0 28-31 * * + scripttarih 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 @yearlyyılbaşı gece yarısı
Hafta içi 9-17 arası her 5 dakikada*/5 9-17 * * 1-5mesai içi yoklama
Hafta sonu her 30 dakikada bir*/30 * * * 0,6Cmt/Paz izlemesi
Saatte iki kez, 15 ve 4515,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 @yearlystandart dışı ama yaygın desteklenir
Yalnızca yeniden başlatmada@rebootstandart 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

AlanAralıkTakma adlarNotlar
Dakika0-59yok0 “saatin tam başı” anlamına gelir
Saat0-23yok24 saatlik düzen; 0 gece yarısı, 12 öğlen
Ayın günü1-31yokbir ay için geçersiz günler sessizce hiç tetiklenmez (31 Şubat)
Ay1-12JAN, FEB, MAR, …, DECbüyük-küçük harfe duyarsız
Haftanın günü0-7SUN, MON, TUE, …, SAThem 0 hem 7 Pazar anlamına gelir

Operatörlerin detayı

Beş operatör her standart cron ifadesini kapsar:

OperatörAnlamıÖrnekGenişletmesi
*herhangi bir değer* * * * *her dakika
,liste0 9,12,17 * * *09:00, 12:00, 17:00
-dahil aralık0 9-17 * * *09:00 ile 17:00 arası her saat
/adım*/15 * * * *dakika 0, 15, 30, 45
karmabileşik0 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:

MakroKarşılığıAnlamı
@yearly / @annually0 0 1 1 *yılda bir, 1 Ocak gece yarısı
@monthly0 0 1 * *her ayın 1’i gece yarısı
@weekly0 0 * * 0her Pazar gece yarısı
@daily / @midnight0 0 * * *her gün gece yarısı
@hourly0 * * * *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.

Özellikvixie cronsystemd timerK8s CronJobGHA scheduleAWS EventBridgeVercel CronCloudflare Workers
Alan sözdizimi5 alan POSIXOnCalendar spec5 alan POSIX + timeZone5 alan POSIX6 alan Quartz, ? ile5 alan POSIX5 alan POSIX
Minimum aralık1 dakika1 saniye1 dakikabest-effort, ≥15 dk önerilir1 dakika1 dakika (Pro plan)1 dakika
Açık zaman dilimiCRON_TZ=Persistent=truespec.timeZone (1.27+)yalnız UTCScheduleExpressionTimezoneyalnız UTCyalnız UTC
Kaçırılan çalışma kurtarmahayır (anacron kullanın)evet (Persistent=true)evet (startingDeadlineSeconds)hayırevethayırhayır
Yeniden deneme / backoffhayırkısmenevet (backoffLimit)hatada yeniden denemeevethayırevet
Eşzamanlılık denetimihayır (flock kullanın)kısmenevet (concurrencyPolicy)hayırhayırhayırhayır
@reboot desteğievetevet (OnBootSec= ile)hayırhayırhayırhayırhayı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ı:

AlanVarsayılanNe yapar
schedulezorunluPOSIX 5 alanlı cron ifadesi
timeZonecontroller TZaçık zaman dilimi (1.27+); IANA adlarını kullanın
concurrencyPolicyAllowForbid önceki etkinken yeni çalışmaları atlar; Replace öncekini iptal eder
startingDeadlineSecondssınırsızbundan daha gecikmişse atla
successfulJobsHistoryLimit3tutulacak başarılı Job sayısı
failedJobsHistoryLimit1tutulacak başarısız Job sayısı
suspendfalsesilmeden duraklat
backoffLimit6Job Failed olarak işaretlenmeden önceki Pod yeniden deneme sayısı
activeDeadlineSecondsyokPod çalışma süresinde sert üst sınır
ttlSecondsAfterFinishedyokJob’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.