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
% 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.
