İkisi de bir şeyi belli bir düzenle çalıştırır. Fark, bir iş başarısız olduğunda, uzun sürdüğünde ya da tam vakti geldiğinde makine kapalı olduğunda ortaya çıkar.

Cron ve iki tuzağı

crontab -e
# m h dom mon dow  command
15 3 * * *  /usr/bin/php /var/www/site/cron.php >> /var/log/site-cron.log 2>&1
  • Ortam neredeyse boştur. PATH en aza inmiştir ve kabuk profiliniz okunmaz; siz elinizle yazdığınızda çalışan bir komut burada başarısız olur. Mutlak yollar kullanın.
  • Çıktı bir kayıt değil, postadır. Yukarıdaki yönlendirme olmadan çıktı, kimsenin okumadığı yerel bir posta kutusuna gider ve iş sessizce çalışmış gibi görünür.

Bir cron işi hiç çalışmıyor gibi görünüyorsa, gerisini Hiç çalışmayan cron işleri içindeki liste kapsar.

Zamanlayıcı ve kattıkları

# /etc/systemd/system/site-cron.service
[Unit]
Description=Site maintenance

[Service]
Type=oneshot
User=www-data
WorkingDirectory=/var/www/site
ExecStart=/usr/bin/php cron.php
# /etc/systemd/system/site-cron.timer
[Unit]
Description=Run site maintenance nightly

[Timer]
OnCalendar=*-*-* 03:15:00
Persistent=true
RandomizedDelaySec=300

[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now site-cron.timer
systemctl list-timers --all
journalctl -u site-cron -n 50

Zamanlayıcının size verdikleri

  • Günlükte kayıtlar, çıkış durumuyla birlikte, her koşu için ayrı ayrı.
  • Üst üste binme yok — bir sonrakinin vakti geldiğinde hâlâ süren bir koşu, ikinci bir kopya başlatmaz.
  • Persistent=true — makine kapalıyken kaçırılan bir koşu, bir sonraki açılışta gerçekleşir.
  • RandomizedDelaySec — bir sunucu filosunun tamamı aynı API'ye tam 03:15:00'te yüklenmez.

Hangisini kullanmalı

Tek bir makinede tek satırlık bir iş: cron, üstünde fazla düşünmeyin. Geçmişini görmeniz gereken her şey, iki kez çalışmaması gereken her şey ve kaçırılırsa önemli olan her şey için: zamanlayıcı.

Aynı işi ikisine birden kurmayın. Bu, yarım kalmış bir geçişin sık görülen sonucudur ve her koşuyu ikiye katlar — posta gönderenleri ve karttan tahsilat yapanları da.