cPanel’de Cron Job’lar Nasıl Yapılandırılır: Eksiksiz Teknik Kılavuz
Bir cron job, Unix benzeri işletim sistemlerinde yerleşik bir arka plan süreci olan cron daemon’ı tarafından yönetilen ve herhangi bir manuel tetikleyici olmaksızın komutları veya betikleri kesin, tekrarlayan aralıklarla çalıştıran zamanlanmış bir görevdir. cPanel’de Cron Jobs arayüzü, bu sistem düzeyindeki zamanlayıcıyı grafiksel bir ön uç aracılığıyla sunar ve komut satırına doğrudan dokunmadan veritabanı bakımından dosya temizliğine kadar her şeyi otomatikleştirmenize olanak tanır.
Bu kılavuz, tam yapılandırma yaşam döngüsünü kapsar: sözdizimi mekaniği, zamanlama stratejileri, çıktı yönetimi, gerçek dünya komut kalıpları ve çoğu öğreticinin tamamen atladığı operasyonel tuzaklar.
cron Daemon’ı Aslında Ne Yapar
crond süreci her dakika uyanır, sistemin crontab dosyalarını okur ve zamanlanmış herhangi bir görevin mevcut zamanla eşleşip eşleşmediğini kontrol eder. cPanel tarafından yönetilen paylaşımlı bir barındırma ortamında, her kullanıcının cron girişleri genellikle /var/spool/cron/<username> konumunda bulunan kullanıcı başına bir crontab dosyasında saklanır. cPanel’in arayüzü, bir iş eklediğinizde veya düzenlediğinizde doğrudan bu dosyaya yazar.
Bu mimariyi anlamak önemlidir çünkü birkaç davranışı açıklar:
* * * * *için zamanlanmış bir iş, her dakikanın başında tetiklenir, sürekli olarak değil.- Sunucu yeniden başlatılırsa veya
cronddakika ortasında yeniden başlatılırsa, o dakika için zamanlanmış bir iş atlanır. - Açıkça yönlendirilmeyen çıktı,
crondtarafından yakalanır ve crontab sahibine e-posta ile gönderilir; bu durum, yüksek frekanslı işlerde bir gelen kutusunu hızla doldurabilir.
Adım 1: cPanel’de Cron Jobs Arayüzüne Erişin
Barındırma sağlayıcınız tarafından sağlanan URL ve kimlik bilgilerini kullanarak cPanel hesabınıza giriş yapın (genellikle https://yourdomain.com:2083).
Kontrol panelinin içine girdikten sonra Gelişmiş bölümüne gidin ve Cron Jobs simgesine tıklayın. Bu, üç işlevsel alana bölünmüş zamanlayıcı arayüzünü açar:
- Cron Email — iş çıktısının gönderildiği yer
- Add New Cron Job — zamanlama formu
- Current Cron Jobs — tüm yapılandırılmış girişlerin canlı listesi
cPanel zaten yüklü bir VPS yönetiyorsanız, aynı arayüz geçerlidir. AlexHost’un cPanel ile VPS ortamları, crond çalışır durumda ve kullanıcı crontab’ları varsayılan olarak etkin şekilde önceden yapılandırılmış olarak gelir.
Adım 2: Cron E-posta Bildirimlerini Yapılandırın
Cron Jobs sayfasının üst kısmındaki Cron Email alanı, crond‘ın her iş yürütmesinin standart çıktısını (stdout) ve standart hatasını (stderr) nereye göndereceğini belirler.
E-posta bildirimlerinin etkinleştirileceği durumlar:
- Yeni bir işin ilk kurulumu ve testi sırasında
- Sessiz başarısızlığın kabul edilemez olduğu kritik işler için (örn. gecelik yedeklemeler)
Çıktının bastırılacağı durumlar:
Yüksek frekanslı veya iyi test edilmiş işler için e-posta çıktısı gürültü oluşturur. Komutunuza aşağıdakini ekleyerek /dev/null‘a yönlendirin:
>/dev/null 2>&1Bu, stdout‘ı /dev/null‘a yönlendirir ve ardından stderr‘ı stdout ile aynı hedefe yönlendirerek tüm çıktıyı etkili bir şekilde susturur. Yaygın bir hata 2>&1 >/dev/null yazmaktır — bu sıra yanlıştır ve stderr‘ı yine de posta sistemine gönderir.
Üretim işleri için daha iyi bir kalıp, e-posta almadan daha sonra denetleyebilmek için çıktıyı bir günlük dosyasına yönlendirmektir:
/usr/bin/php /home/user/public_html/script.php >> /home/user/logs/cron.log 2>&1>> operatörü, her çalıştırmada üzerine yazmak yerine günlük dosyasına ekler.
Adım 3: Cron Zamanlama Sözdiziminde Ustalaşın
Her cron girişi, komuttan önce katı bir beş alan biçimini izler:
* * * * * command_to_execute
| | | | |
| | | | +--- Day of Week (0–7, Sunday = 0 or 7)
| | | +------- Month (1–12)
| | +----------- Day of Month (1–31)
| +--------------- Hour (0–23)
+------------------- Minute (0–59)Özel Sözdizimi Operatörleri
Basit tam sayılar ve joker karakterlerin ötesinde, cron sözdizimi hassas zamanlamayı mümkün kılan dört operatörü destekler:
| Operatör | Anlam | Örnek | Sonuç |
|---|---|---|---|
| ———- | ——— | ——— | ——– |
| `*` | Her birim | `* * * * *` | Her dakika |
| `,` | Değer listesi | `0 9,17 * * *` | Her gün sabah 9:00 ve akşam 17:00’de |
| `-` | Değer aralığı | `0 9-17 * * *` | Sabah 9’dan akşam 5’e kadar her saat |
| `*/n` | Adım değeri | `*/15 * * * *` | Her 15 dakikada bir |
Pratik Zamanlama Örnekleri
# Every 5 minutes
*/5 * * * *
# Every day at 2:30 AM
30 2 * * *
# Every Monday at 8:00 AM
0 8 * * 1
# First day of every month at midnight
0 0 1 * *
# Every weekday (Mon–Fri) at 6:00 PM
0 18 * * 1-5
# Twice a day, at noon and midnight
0 0,12 * * *
# Every 6 hours
0 */6 * * *Kritik uç durum — Ayın Günü ile Haftanın Günü çakışması: Hem ayın günü hem de haftanın günü alanları * dışında bir değere ayarlandığında, crond bunları AND koşulu olarak değil, OR koşulu olarak değerlendirir. 0 0 1 * 1 olarak ayarlanmış bir iş, ayın birinde ve her Pazartesi çalışır — yalnızca ayın birinci gününe denk gelen Pazartesilerde değil. Bu durum birçok yöneticiyi şaşırtır.
Adım 4: Yeni Bir Cron Job Ekleyin
Add New Cron Job bölümünde cPanel, kolaylık sağlamak için önceden ayarlanmış zamanlama açılır menüleri sunar (Her Dakika, Her Saat, Her Gün vb.). Bu ön ayarlar yalnızca beş zamanlama alanını doldurur — özel zamanlamalar için bunları her zaman manuel olarak geçersiz kılabilirsiniz.
Doğru PHP İkili Yolunu Belirleme
cPanel cron job’larındaki en yaygın başarısızlık noktalarından biri, yanlış yorumlayıcı yolunun kullanılmasıdır. Sunucunun PATH ortamını devralan bir web isteğinin aksine, cron job’ları php‘ın tam bir yol olmadan çözümlenemeyebileceği minimal bir ortamda çalışır.
Sunucunuzdaki doğru PHP ikili dosyasını bulmak için cPanel’in Terminal aracı veya SSH aracılığıyla aşağıdakini çalıştırın:
which phpÇoğu cPanel sunucusunda sonuç şunlardan biri olacaktır:
/usr/bin/php
/usr/local/bin/php
/opt/cpanel/ea-php82/root/usr/bin/phpBarındırma sağlayıcınız birden fazla PHP sürümüyle EasyApache 4 kullanıyorsa, tam sürümlü ikili dosyayı belirtmeniz gerekir. Örneğin, PHP 8.2 kullanmak için:
/opt/cpanel/ea-php82/root/usr/bin/php -q /home/user/public_html/script.php-q bayrağı, PHP CLI çıktısındaki HTTP başlıklarını bastırır; bu da e-posta bildirimlerinde veya günlük dosyalarında gereksiz verilerin görünmesini önler.
Tam Komutu Oluşturma
Bir PHP betiği için iyi biçimlendirilmiş bir cron komutu şöyle görünür:
/usr/local/bin/php -q /home/username/public_html/cron/task.php >> /home/username/logs/task.log 2>&1Bir Bash betiği için, çalıştırılabilir olduğundan emin olun (chmod +x /path/to/script.sh) ve doğrudan referans verin:
/bin/bash /home/username/scripts/cleanup.sh >> /home/username/logs/cleanup.log 2>&1Bir virtualenv kullanan Python betiği için:
/home/username/venv/bin/python /home/username/scripts/report.py >> /home/username/logs/report.log 2>&1Zamanlama alanlarını ve komutu girdikten sonra Add New Cron Job‘a tıklayın. Giriş hemen Current Cron Jobs tablosunda görünür ve aktif hale gelir.
Adım 5: Mevcut Cron Job’ları Yönetin
Bir Cron Job’ı Düzenleme
Current Cron Jobs tablosunda, değiştirmek istediğiniz girişin yanındaki Edit‘e tıklayın. Zamanlama alanlarını veya komutu güncelleyin, ardından kaydetmek için Edit Line‘a tıklayın. Değişiklikler bir sonraki zamanlanmış çalıştırmada geçerli olur — yeniden başlatma gerekmez.
Bir Cron Job’ı Silme
Girişin yanındaki Delete‘e tıklayın ve onaylayın. Crontab satırı hemen kaldırılır.
Bir Cron Job’ı Silmeden Geçici Olarak Devre Dışı Bırakma
cPanel’in arayüzü yerel bir “duraklat” geçişi sağlamaz. Geçici çözüm, işi düzenlemek ve komutu, zamanlamayı korurken yürütmeyi önleyen bir no-op ile başa eklemektir. En temiz yöntem, gerçek komutu yorum benzeri bir yapıyla değiştirmektir:
# /usr/local/bin/php -q /home/user/public_html/script.phpAncak cPanel, # karakterini kaldırabilir. Daha güvenilir bir yaklaşım, komutu geçici olarak şununla değiştirmektir:
/bin/trueBu anında çalışır ve hiçbir şey yapmaz; orijinal komutu geri yükleyene kadar zamanlamayı korur.
Ham Crontab’ı Görüntüleme
SSH erişiminiz varsa, ham crontab’ı doğrudan inceleyebilir ve düzenleyebilirsiniz:
crontab -lDüzenlemek için:
crontab -eBu, crontab’ı sistemin varsayılan düzenleyicisinde açar. Buradaki manuel düzenlemelerin cPanel’in arayüzüne yansıdığını ve bunun tersinin de geçerli olduğunu unutmayın — her ikisi de aynı dosyaya yazar.
Adım 6: Cron Job’larınızı Test Edin ve Doğrulayın
Bir cron job’ın kaydedildiği için çalıştığını asla varsaymayın. Cron’un çalıştığı ortam, etkileşimli bir kabuk oturumundan önemli ölçüde farklıdır.
Test Stratejisi
Adım 1 — Önce komutu manuel olarak çalıştırın. Herhangi bir şey zamanlamadan önce, hata olmadan beklenen çıktıyı ürettiğini doğrulamak için tam komutu SSH veya cPanel Terminal aracılığıyla çalıştırın:
/usr/local/bin/php -q /home/username/public_html/script.phpAdım 2 — İlk test için yüksek frekansta zamanlayın. İşi her dakika tetiklemek için zamanlamayı geçici olarak * * * * * olarak ayarlayın. Yürütmeyi onaylamak için 2-3 dakika sonra günlük dosyanızı veya e-postanızı kontrol edin.
Adım 3 — Günlük dosyasını kontrol edin. Çıktıyı bir günlük dosyasına yönlendirdiyseniz, inceleyin:
tail -f /home/username/logs/cron.logAdım 4 — İşin temiz çalıştığını onayladıktan sonra doğru zamanlamayı geri yükleyin.
Yaygın Başarısızlık Nedenleri
- Betiklerdeki göreli yollar:
include 'config.php'kullanan bir betik, çalışma dizini betiğin dizini olmadığı için cron’da başarısız olur. Yolları betiğin konumuna göre çözümlemek için PHP’de__DIR__veya Bash’te$(dirname "$0")kullanın. - Eksik ortam değişkenleri: Cron,
.bashrcveya.bash_profile‘ı yüklemez. Betiğiniz ortam değişkenlerine bağımlıysa, bunları crontab’ın üst kısmında veya betiğin kendisinde açıkça tanımlayın. - İzin hataları: Betik, crontab sahibi tarafından okunabilir ve kabuk betikleri için çalıştırılabilir olmalıdır.
- Veritabanı bağlantı hataları: Unix soketi aracılığıyla
localhostkullanarak MySQL’e bağlanan betikler, soket yolu cron ortamında farklıysa başarısız olabilir. Bunun yerine açık bir port ile127.0.0.1kullanın.
Gerçek Dünya Cron Job Kalıpları
Otomatik Günlük Veritabanı Yedeklemesi
0 2 * * * /usr/bin/mysqldump -u dbuser -p'StrongPassword' dbname | gzip > /home/username/backups/db_$(date +%Y%m%d).sql.gz 2>> /home/username/logs/backup.logKaçan % karakterlerine (%) dikkat edin. % sembolü crontab dosyalarında özel bir anlam taşır (yeni satır olarak işlev görür), bu nedenle her zaman ters eğik çizgi ile kaçırılmalıdır.
Haftalık Günlük Döndürme ve Temizleme
0 3 * * 0 find /home/username/logs/ -name "*.log" -mtime +30 -delete >> /home/username/logs/cleanup.log 2>&1Bu, her Pazar sabahı 3:00’te 30 günden eski günlük dosyalarını siler.
Zamanlanmış Önbellek Temizleme
0 */4 * * * /usr/local/bin/php -q /home/username/public_html/wp-cron.php >> /home/username/logs/wp-cron.log 2>&1WordPress siteleri için, gerçek bir cron job aracılığıyla wp-cron.php çalıştırmak (ve wp-config.php‘a define('DISABLE_WP_CRON', true); ekleyerek varsayılan sahte cron’u devre dışı bırakmak), ziyaretçi tarafından tetiklenen yürütmeye güvenmekten çok daha güvenilirdir.
Zamanlanmış Rapor E-postası Gönderme
30 8 * * 1 /usr/local/bin/php -q /home/username/scripts/weekly_report.php >> /home/username/logs/report.log 2>&1Her Pazartesi sabah 8:30’da çalışır. Bunu giden işlemsel posta için özel bir posta kutusuyla eşleştirin — AlexHost’un E-posta Barındırma hizmeti, otomatik gönderim için uygun izole SMTP altyapısı sağlar.
SSL Sertifikası Son Kullanma Tarihi Kontrolü
0 9 * * * /usr/bin/openssl s_client -connect yourdomain.com:443 -servername yourdomain.com </dev/null 2>/dev/null | /usr/bin/openssl x509 -noout -dates >> /home/username/logs/ssl_check.log 2>&1Sertifikanızın geçerlilik tarihlerini kaydeden hafif bir günlük kontrol. Yönetilen SSL düzenleme ve yenileme için AlexHost’un SSL Sertifikaları hizmetini değerlendirin.
Cron Job’lar ile Alternatif Zamanlama Yaklaşımları
| Özellik | cPanel Cron Jobs | Systemd Timers | Harici İzleme Cron’u (örn. EasyCron) |
|---|---|---|---|
| ——— | —————– | —————- | ——————————————- |
| Gerekli erişim düzeyi | cPanel kullanıcısı | Root / sudo | Yok (web tabanlı) |
| Minimum aralık | 1 dakika | Saniyenin altı | 1 dakika (ücretsiz katman) |
| Kaçırılan iş yönetimi | Yerleşik yeniden deneme yok | `Persistent=true` seçeneği | Uyarı ve yeniden deneme mantığı |
| Günlükleme | Manuel (dosyaya yönlendirme) | `journald` (otomatik) | Geçmişli kontrol paneli |
| Ortam izolasyonu | Minimal kabuk ortamı | Tam systemd ortamı | Harici HTTP çağrısı |
| Paylaşımlı barındırma için uygun | Evet | Hayır | Evet |
| VPS / dedicated için uygun | Evet | Tercih edilen | İsteğe bağlı ek |
Bir Dedicated Server veya tam yönetilen bir VPS üzerinde iş yükleri çalıştıran ekipler için, kritik zamanlanmış görevleri cPanel cron’dan systemd timer’larına taşımak daha iyi günlükleme, bağımlılık yönetimi ve hata kurtarma sağlar. Paylaşımlı barındırma kullanıcıları için cPanel cron job’ları en pratik ve erişilebilir seçenek olmaya devam eder — AlexHost’taki Paylaşımlı Web Barındırma planları, standart cPanel arayüzü aracılığıyla tam cron job desteği içerir.
Cron Job’lar için Güvenlik Değerlendirmeleri
crontab -lile tüm kullanıcılara görünür olan crontab girişlerine asla kimlik bilgilerini sabit kodlamayın. Veritabanı parolalarınıchmod 600ile korumalı bir yapılandırma dosyasında saklayın ve betiğin içinden referans verin.- Bir cron job harici verileri işliyorsa (örn. bir dizine bırakılan dosyalar) betik girdilerini doğrulayın. Otomatik bir bağlamda doğrulanmamış girdi önemli bir saldırı yüzeyi oluşturur.
- Betik izinlerini gereken minimum düzeyde tutun. Yalnızca belirli bir dizine okuma ve yazma yapan bir PHP betiği, dünya tarafından okunabilir veya çalıştırılabilir olmamalıdır.
- Cron job’larınızı periyodik olarak denetleyin. cPanel erişimi kazanan saldırganlar bazen kalıcı cron job’ları yükler. Herhangi bir şüpheli ihlalden sonra Current Cron Jobs listesini inceleyin.
Teknik Karar Kontrol Listesi
Herhangi bir cron job’ı üretime dağıtmadan önce aşağıdakilerin her birini doğrulayın:
- Komut, tam olarak aynı sözdizimi ile SSH veya cPanel Terminal aracılığıyla manuel olarak çalıştırıldığında başarıyla çalışır.
- Komuttaki ve betiğin kendisindeki tüm dosya yolları göreli değil, mutlaktır.
%karakteri, crontab komutunda göründüğü her yerde%olarak kaçırılmıştır.- Çıktı bir günlük dosyasına yönlendirilir veya açıkça bastırılır — cron e-posta adresini doldurmaya bırakılmaz.
- PHP ikili yolu, uygulamanızın gerektirdiği sürümle eşleşir (
which phpile onaylayın veya EasyApache ayarlarını kontrol edin). - Crontab kullanıcısının hedef betik üzerinde okuma ve çalıştırma izinleri vardır.
- Cron ortamında Unix soket çözümlemesi güvenilir değilse, veritabanı bağlantıları
localhostyerine127.0.0.1kullanır. - WordPress için: Gerçek bir cron job kullanarak
wp-cron.php‘ı tetikliyorsanızwp-config.php‘daDISABLE_WP_CRONdeğeritrueolarak ayarlanmıştır. * * * * *ile bir test çalıştırması gerçekleştirildi ve günlük, son zamanlama uygulanmadan önce temiz yürütmeyi onayladı.
SSS
S: Cron job’ım cPanel’e kaydedilmiş olmasına rağmen neden çalışmıyor?
En yaygın nedenler yanlış ikili yoldur (örn. /usr/local/bin/php yerine php kullanmak), etkileşimli bir kabuk dışında başarısız olan göreli yola sahip bir betik veya betik dosyasında izin hatası. Sorunu izole etmek için önce tam komutu SSH aracılığıyla manuel olarak çalıştırın.
S: cPanel’de dakikada birden daha sık cron job çalıştırabilir miyim?
Hayır. Standart crond zamanlayıcısının bir dakikalık çözünürlüğü vardır. Dakika altı yürütme için, paylaşımlı barındırmada mevcut olmayan root erişimine ihtiyaç duyarsınız (döngüsel kabuk betiği veya systemd timer gibi bir geçici çözüm uygulamak için).
S: >/dev/null 2>&1 ne anlama gelir ve ne zaman kullanmalıyım?
Standart çıktıyı /dev/null‘a (atarak) yönlendirir ve ardından standart hatayı aynı hedefe yönlendirir. Bunu yalnızca sessiz başarısızlığın kabul edilebilir olduğu, iyi test edilmiş, kritik olmayan işlerde kullanın. Önemli herhangi bir şey için bunun yerine >> /path/to/file.log 2>&1 ile bir günlük dosyasına yönlendirin.
S: Cron job’ım SSH’da çalışıyor ama zamanlandığında neden başarısız oluyor?
Cron, kullanıcınızın kabuk profili olmadan soyulmuş bir ortamda çalışır. PATH‘ı, takma adları veya .bashrc‘da tanımlanan ortam değişkenlerini yüklemez. Tüm ikili dosyalar ve dosyalar için her zaman tam mutlak yollar kullanın ve gerekli ortam değişkenlerini betiğin içinde veya crontab girişinin üst kısmında açıkça tanımlayın.
S: Bir çalıştırma aralığından daha uzun sürerse, aynı cron job’ın iki örneğinin aynı anda çalışmasını nasıl önlerim?
İşi çalıştırmadan önce özel bir kilit almak için flock kullanın:
*/5 * * * * /usr/bin/flock -n /tmp/myjob.lock /usr/local/bin/php -q /home/username/public_html/script.php >> /home/username/logs/script.log 2>&1-n bayrağı, kilit zaten tutuluyorsa flock‘ın hemen çıkmasına (engellemesiz) neden olur; bu da birinci örnek hâlâ çalışırken ikinci bir örneğin başlamasını önler.
