Komut uçbiriminizde çalışıyor, gecenin üçünde hiçbir şey üretmiyor. cron bozuk değildir. Komutunuzu, kabuğunuza neredeyse hiç benzemeyen bir ortamda çalıştırır ve yanıtın tamamı bu farktır.

Ne olduğuna bakın

grep CRON /var/log/syslog | tail -20

Göreviniz orada hiç yoksa, cron hiç denememiştir. Oradaysa, cron onu çalıştırmış ve başka bir şey ters gitmiştir.

1. PATH neredeyse boştur

Kabuğunuz php'nin nerede olduğunu bilir. cron bilmez — PATH'i genelde yalnızca /usr/bin:/bin'dir. Her zaman tam yolu kullanın.

which php
# /usr/bin/php8.3

# in the crontab
0 3 * * * /usr/bin/php8.3 /var/www/site/cron.php

2. Çıktı hiçbir yere gitmez

Yönlendirmesi olmayan bir görev, çıktısını yapılandırılmamış bir postaya gönderir; böylece hatalar buhar olur. Onu bir dosyaya gönderin, bir sonraki başarısızlık kendi kendini açıklasın.

0 3 * * * /usr/bin/php8.3 /var/www/site/cron.php >> /var/log/site-cron.log 2>&1

3. Yanlış kullanıcı

root'un crontab'ındaki bir görev, sahibi root olan dosyalar yazar ve web sunucusu sonra bunları değiştiremez. Görevi, sitenin sahibi olan kullanıcının crontab'ına koyun.

crontab -u youruser -l

4. Bir yüzde işareti

crontab içinde % satır sonu demektir. +%Y-%m-%d gibi bir tarih biçimi sessizce üç satıra dönüşür ve komut kırılır. Kaçırın: \%.

Onu cron'un çalıştıracağı gibi sınayın

env -i /bin/sh -c "/usr/bin/php8.3 /var/www/site/cron.php"

Bu, görevi boş bir ortamda çalıştırır; cron'un yaptığı da budur. Burada başarısız olursa, saat üçte de olacaktır.

WordPress'in cron'u cron değildir: sayfa yüklendikçe çalışır, dolayısıyla sessiz bir site görevlerini hiç çalıştırmaz. WP_CRON'u kapatın ve wp-cron.php'yi gerçek bir zamanlanmış görevden çağırın.