# Zamanlanmış görevler

Kaynak: <https://deckpa.com/docs/cron>

> Site kullanıcısı adına çalışan cron görevlerini hazır şablonlarla ekleyin; çıktı bir kayıt dosyasına yazılır.

## Nasıl çalışır

Zamanlanmış görevleri **Site Merkezi → Zamanlanmış Görevler** sayfasından ya da bir sitenin **Cron** sekmesinden yönetirsiniz (bkz. [Site Merkezi](https://deckpa.com/docs/site-hub)). Sayfanın üstündeki site seçicisinden hangi sitenin görevlerine bakacağınızı seçersiniz; listede **Zamanlama**, **Komut** ve **Not** sütunları görünür.

Her görev, sitenin Linux kullanıcısının crontab dosyasına panelin işaretlediği bir satır olarak yazılır ve o kullanıcının yetkisiyle çalışır. Panel yalnızca kendi eklediği satırları yönetir. Görevi sonradan düzenleyemezsiniz; değiştirmek için görevi silip yeniden eklersiniz. Aynı zamanlama ve komutla ikinci bir görev eklenemez.

Görevin çalıştığı ortam sitenin kendi ortamıdır: crontab'a, sitenin özel geçici dizinini gösteren bir `TMPDIR` satırı yazılır ve her görev `umask 077` ile başlar. Bu nedenle görevin oluşturduğu dosyalar yalnızca site kullanıcısı tarafından okunabilir.

## Görev ekleme

**Yeni Görev** düğmesi üç adımlı bir sihirbaz açar: **Görev şablonu**, **Zamanlama** ve **Onayla**. Son adımda panel, çalıştıracağı komutu **Ne çalışacak** başlığı altında gösterir. İsterseniz göreve bir not yazabilirsiniz (örneğin "WordPress zamanlanmış görev"); not yalnızca listede görünür. **Görevi ekle** ile görev crontab'a yazılır. Silmek için satırdaki sil simgesini kullanırsınız; panel "Bu cron görevi silinsin mi?" diye onay ister.

Panel komutu sizin yerinize oluşturur, elle komut yazmanız gerekmez. Komutlardaki PHP yolu, sitenin PHP sürümüne bağlı bir bağlantıdır; sitenin PHP sürümünü değiştirdiğinizde görevler de otomatik olarak yeni sürümle çalışır (bkz. [PHP sürümü ve ayarları](https://deckpa.com/docs/php)). Listede görevin yanında "PHP 8.4" gibi bir rozet bu bağı gösterir.

## Hazır görev şablonları

- **WordPress cron** — sitenin `wp-cron.php` dosyasını zamanlanmış aralıklarla tetikler. WordPress'in ziyaretçi isteğiyle tetiklediği zamanlayıcıyı kapatıp gerçek bir cron kullanmak için `wp-config.php` dosyasına `define('DISABLE_WP_CRON', true);` satırını ekleyin.
- **Laravel scheduler** — `artisan schedule:run` komutunu çalıştırır. Laravel'in kendi zamanlayıcısı için sıklığı **Her dakika** seçin.
- **Kendi PHP dosyanız** — site dizininde seçtiğiniz bir `.php` dosyasını çalıştırır. Yol site dizinine görelidir (örneğin `scripts/temizle.php`), yalnızca harf, rakam, `_`, `.`, `/` ve `-` içerebilir ve `..` ile dizin dışına çıkılamaz.
- **Dış URL'e istek** — girdiğiniz adrese zamanlanmış aralıklarla istek gönderir. Panel bu isteği en çok 30 saniye süren bir `curl` komutuyla yapar. Adres `http://` ya da `https://` ile başlamalıdır ve yalnızca harf, rakam ve `. - / : ? & = % _` karakterlerini içerebilir. Adres doğrudan bir IP adresi olarak yazılmışsa ve bu adres yerel (`127.0.0.1` gibi) ya da özel ağ adresiyse reddedilir.
- **Serbest komut** — doğrudan kabuk (shell) komutu yazarsınız. Yalnızca yönetici hesabı bu şablonu görür; diğer hesaplarda panel "Serbest komut yalnız yönetici hesabına açık — bir hazır şablon seçin" uyarısı verir. Komutta satır sonu ve `%` karakteri kullanılamaz, çünkü crontab'da özel anlamları vardır.

## Zamanlama

Zamanlama adımında **Basit** kipinde bir **Sıklık** seçersiniz: **Her dakika**, **5 dk'da bir**, **Saatlik**, **Günlük**, **Haftalık**, **Aylık** ya da **Yıllık**. Seçime göre **Saat**, **Dakika**, **Gün**, **Ayın günü** ve **Ay** alanları açılır. Panel bu seçimleri crontab ifadesine çevirir ve onay adımında gösterir.

Yönetici hesabında ayrıca **Gelişmiş** kip vardır. Bu kipte beş alanlı cron ifadesini (dakika, saat, ayın günü, ay, haftanın günü) kendiniz yazarsınız ya da `@daily` gibi bir anahtar kullanırsınız. Her alan `*`, bir sayı, `1-5` gibi bir aralık, `*/10` gibi bir adım ya da virgülle ayrılmış bir liste olabilir. Gün ve ay adları (örneğin `mon`) kabul edilmez, sayı kullanın.

```text
*/5 * * * *     her 5 dakikada bir
0 3 * * *       her gün 03:00
30 2 * * 0      pazar günleri 02:30
0 0 1 * *       her ayın 1'i, gece yarısı
@hourly         her saat başı
```

Kabul edilen anahtarlar `@reboot`, `@yearly`, `@annually`, `@monthly`, `@weekly`, `@daily`, `@midnight` ve `@hourly` olarak sınırlıdır.

## Çıktı ve askıya alma

Her görevin çıktısı (hem normal çıktı hem hata mesajları) sitenin `cron.log` dosyasına eklenir. Bu dosya sitenin ev dizininde değil, sunucuda panelin kendi dizinindedir ve Dosya Yöneticisi'nde görünmez:

```bash
tail -n 50 /var/lib/deckpa/crons/example.com/cron.log
```

Dosya site kullanıcısına aittir ve yalnızca onun okuyup yazabildiği izinle (0600) tutulur; sunucu yöneticisi root olarak okuyabilir. Alt alan adı için eklenen bir görevin çıktısı, alt alan adının kendi adıyla anılan dizindeki `cron.log` dosyasına yazılır. Görevin çıktısını panelden görmeniz gerekiyorsa betiğinizin kendi günlüğünü site klasörü içindeki bir dosyaya yazmasını sağlayın.

Yönetici, **Loglar** sayfasındaki **Cron** sekmesinde sunucunun cron servisinin kaydını görür: bir görevin tetiklenip tetiklenmediğini oradan anlarsınız. Görev tetiklenmişse ama beklediğiniz sonucu vermemişse sorun çoğunlukla görevin kendi içindedir ve `cron.log` dosyasında görünür.

Siteyi askıya aldığınızda zamanlanmış görevler durur: panel görev satırlarını silmez, yalnızca etkisizleştirir; askı kaldırıldığında görevler yeniden etkinleşir.

> Sık çalışan görevler (her dakika gibi) sunucuyu sürekli meşgul eder. Bir görevin gerçekten o sıklıkta çalışması gerekmiyorsa daha seyrek bir zamanlama seçin ve önceki çalışma bitmeden yenisinin başlamayacağından emin olun.

## Sık sorunlar

- **Bu zamanlama ve komutla aynı görev zaten var** — aynı zamanlama ve komuta sahip bir görev eklenemez. Mevcut görevi silin ya da zamanlamayı değiştirin.
- **Bilinmeyen görev şablonu** — sitenin PHP sürümü sunucuda kurulu değilse şablonlar çalışmaz. Sitenin **Ayarlar** sekmesinden kurulu bir sürüm seçin.
- **Geçersiz URL** — dış URL şablonunda adres `http://` ya da `https://` ile başlamalı ve izinli karakterlerden oluşmalıdır. `#` ya da `+` içeren adresler kabul edilmez.
- **Geçersiz dosya yolu** — "Kendi PHP dosyanız" şablonunda yalnızca site dizinindeki bir `.php` dosyası seçilebilir.
- **Görev hiç çalışmıyor** — sitenin askıda olmadığını, zamanlamanın beklediğiniz anı gösterdiğini ve komutun site kullanıcısıyla çalışacak şekilde yazıldığını denetleyin. Yönetici, **Loglar → Cron** sekmesinden görevin tetiklenip tetiklenmediğine bakabilir.
