🕒 Pardus Linux’ta Zamanlanmış Görevler /etc/cron.* ve /etc/cron.d

Pardus Linux’ta cron, sistem yöneticilerinin ve paketlerin belirli işleri otomatik ve düzenli olarak çalıştırmasını sağlar. Okul ortamlarında cron;

  • Akıllı tahtaların otomatik kapatılması

  • Log temizliği

  • Yedekleme

  • Günlük bakım

  • Öğrenci/öğretmen politikalarının uygulanması

gibi kritik görevler için vazgeçilmezdir.


1️⃣ Cron Mimarisi – Büyük Resim

Pardus’ta cron sistemi iki ana yapı üzerinden çalışır:

cron servisi ├─ /etc/crontab ├─ /etc/cron.hourly/ ├─ /etc/cron.daily/ ├─ /etc/cron.weekly/ ├─ /etc/cron.monthly/ └─ /etc/cron.d/

2️⃣ /etc/cron.hourly/

⏱ Saatlik Görevler

  • Her saat başı çalışır

  • Dosyalar çalıştırılabilir (chmod +x) olmalıdır

  • Zaman belirtmeye gerek yoktur

📌 Kullanım Alanı

  • Anlık log kontrolü

  • Disk doluluk uyarıları

  • ETAP tahtalarda sistem sağlığı kontrolü

🧪 Örnek: Saatlik Disk Kontrolü

sudo nano /etc/cron.hourly/disk_kontrol.sh
#!/bin/bash df -h > /var/log/disk_durumu.log
sudo chmod +x /etc/cron.hourly/disk_kontrol.sh

3️⃣ /etc/cron.daily/

📆 Günlük Görevler

  • Günde 1 kez (genelde sabaha karşı)

  • Pardus’ta logrotate, apt-clean gibi görevler buradadır

📌 Okul Senaryosu

  • Günlük cache temizliği

  • Öğrenci masaüstü geçici dosya temizliği

🧪 Örnek: Öğrenci Temp Temizliği

sudo nano /etc/cron.daily/ogrenci-temp-temizle
#!/bin/bash find /home -type d -name ".cache" -exec rm -rf {}/* \;
sudo chmod +x /etc/cron.daily/ogrenci-temp-temizle

4️⃣ /etc/cron.weekly/

📅 Haftalık Görevler

  • Haftada 1 kez

  • Ağır bakım işlemleri için idealdir

📌 Örnek Kullanım

  • Samba AD yedekleri

  • Haftalık raporlama

sudo nano /etc/cron.weekly/samba-ad-backup
#!/bin/bash tar czf /backup/samba_$(date +%F).tar.gz /var/lib/samba

5️⃣ /etc/cron.monthly/

🗓 Aylık Görevler

  • Ayda 1 kez

  • Arşivleme ve uzun vadeli temizlik

📌 Örnek

  • Eski logların silinmesi

  • Uzun dönem istatistik raporları


6️⃣ /etc/cron.d/

🎯 Profesyonel ve Paket Dostu Cron Alanı

En kritik dizin burasıdır

🔑 Özellikleri

  • Dosya içinde zaman + kullanıcı tanımlanır

  • Paketler bu dizini kullanır

  • Kurumsal yapı için en doğru tercih

📄 Dosya Formatı

dakika saat gün ay hafta_künü kullanıcı komut

🧪 Örnek: ETAP Tahtaları Otomatik Kapatma

sudo nano /etc/cron.d/etap-kapat
0 17 * * 1-5 root /usr/sbin/poweroff

📌 Hafta içi her gün saat 17:00’de kapanır


7️⃣ TSOMTAL Özel Senaryoları

🎓 Öğrenci Bilgisayarları – Gece Kapanış

0 18 * * * root /usr/sbin/poweroff

👨‍🏫 Öğretmen Bilgisayarları – Geç Kapanış

0 20 * * * root /usr/sbin/poweroff

Bu ayrımı Samba AD grup kontrolü + script ile yapabilirsiniz.


8️⃣ Cron Logları Nerede?

journalctl -u cron

veya

grep CRON /var/log/syslog

📌 Sorun giderme için hayati


9️⃣ Cron vs systemd timer (Kısa Karşılaştırma)

Özellikcronsystemd timer
Basit işler⚠️
Paket uyumu
Kurumsal yönetim⚠️
Log takibiOrtaÇok iyi

👉 Geleneksel bakım işleri → cron
👉 Modern kapanma / açılma senaryoları → systemd timer


🔐 Güvenlik Notları

  • /etc/cron.* içindeki dosyalar root yetkisiyle çalışır

  • Script içinde tam yol kullanın (/usr/bin/rm)

  • Kullanıcıdan veri alan script yazmayın


📌 Sonuç

  • /etc/cron.hourly → hızlı kontroller

  • /etc/cron.daily → günlük bakım

  • /etc/cron.weekly → sistem yedekleri

  • /etc/cron.monthly → arşivleme

  • /etc/cron.d → kurumsal ve profesyonel kullanım

    Aşağıya Samba AD grup bazlı cron çalıştırma + ETAP 23 için hazır cron paket yapısını, doğrudan okul ortamında kullanabileceğiniz şekilde “kopyala-çalıştır” mantığıyla verdim. (Pardus 23.x / Debian tabanlı)


    1) Samba AD Grup Bazlı Cron Çalıştırma

    Cron satırında doğrudan “şu AD grubundaysa çalıştır” diye bir özellik yok. En sağlam yöntem:

    • Cron tek bir komut çalıştırır (root)

    • Komut bir wrapper (sarmalayıcı) script olur

    • Script, aktif kullanıcıyı/oturumu bulur

    • O kullanıcı AD grubunda mı? kontrol eder

    • Şart sağlanıyorsa asıl işi çalıştırır

    1.1. Gerekli paketler

    sudo apt update sudo apt install -y realmd sssd sssd-tools libnss-sss libpam-sss adcli oddjob oddjob-mkhomedir samba-common-bin

    Not: Siz zaten Samba AD domain’e katılıysanız çoğu kurulu olabilir.

    1.2. ETAP cihazda “aktif kullanıcıyı” bulma (grafik oturum)

    ETAP’ta çoğu zaman tek aktif oturum olur. Aşağıdaki yöntem pratik:

    loginctl list-sessions loginctl show-session <ID> -p Name -p State -p Type

    Biz bunu script’e gömeceğiz.

    1.3. Grup kontrol scripti (wrapper)

    /usr/local/sbin/tsomtal-cron-ifingroup oluşturun:

    sudo nano /usr/local/sbin/tsomtal-cron-ifingroup

    İçeriği:

    #!/bin/bash # tsomtal-cron-ifingroup # Kullanım: # tsomtal-cron-ifingroup "GRUP_ADI" /path/komut arg1 arg2... set -euo pipefail REQ_GROUP="${1:?Grup adı gerekli}" shift CMD=("$@") log() { logger -t "tsomtal-cron" "$*"; } # Aktif grafik oturumdan kullanıcıyı bul ACTIVE_USER="" while read -r sid _; do u="$(loginctl show-session "$sid" -p Name --value 2>/dev/null || true)" st="$(loginctl show-session "$sid" -p State --value 2>/dev/null || true)" ty="$(loginctl show-session "$sid" -p Type --value 2>/dev/null || true)" if [[ "$st" == "active" && "$ty" == "wayland" || "$ty" == "x11" ]]; then ACTIVE_USER="$u" break fi done < <(loginctl list-sessions --no-legend 2>/dev/null | awk '{print $1, $2}') # Grafik yoksa (gece) fallback: son login olan kullanıcı (opsiyonel) if [[ -z "${ACTIVE_USER}" ]]; then ACTIVE_USER="$(last -w | awk 'NF && $1 != "reboot" && $1 != "wtmp" {print $1; exit}')" fi if [[ -z "${ACTIVE_USER}" ]]; then log "Aktif kullanıcı bulunamadı. Komut çalıştırılmadı: ${CMD[*]}" exit 0 fi # Kullanıcı gruplarını al (SSSD/winbind üzerinden) if id "$ACTIVE_USER" &>/dev/null; then if id -nG "$ACTIVE_USER" | tr ' ' '\n' | grep -Fxq "$REQ_GROUP"; then log "OK: $ACTIVE_USER -> $REQ_GROUP içinde. Çalıştırılıyor: ${CMD[*]}" exec "${CMD[@]}" else log "SKIP: $ACTIVE_USER -> $REQ_GROUP içinde değil. Atlandı: ${CMD[*]}" exit 0 fi else log "Kullanıcı id ile çözümlenemedi: $ACTIVE_USER. Atlandı." exit 0 fi

    Yetki verin:

    sudo chmod 0755 /usr/local/sbin/tsomtal-cron-ifingroup

    Grup adı nasıl seçilecek?

    Samba AD’de örnek:

    • ETAP_OGRETMEN

    • ETAP_OGRENCI

    id -nG kullanıcıadı çıktısında gördüğünüz grup ismini aynen kullanın.


    1.4. Cron.d ile kullanım örnekleri

    ✅ Öğretmen grubuna özel (örnek: akşam geç kapanma)

    sudo nano /etc/cron.d/tsomtal-etap-ogretmen
    # Hafta içi 18:30'da sadece ETAP_OGRETMEN grubunda oturum varsa çalışsın 30 18 * * 1-5 root /usr/local/sbin/tsomtal-cron-ifingroup "ETAP_OGRETMEN" /usr/sbin/poweroff

    ✅ Öğrenci grubuna özel (örnek: erken kapanma)

    sudo nano /etc/cron.d/tsomtal-etap-ogrenci
    # Hafta içi 17:00'de sadece ETAP_OGRENCI grubunda oturum varsa çalışsın 0 17 * * 1-5 root /usr/local/sbin/tsomtal-cron-ifingroup "ETAP_OGRENCI" /usr/sbin/poweroff

    2) ETAP 23 için Hazır Cron Paket Yapısı (TSOMTAL Şablonu)

    Aşağıda .deb paket gibi dağıtabileceğiniz “kurumsal şablon” yapıyı veriyorum. Mantık:

    • Script’ler /usr/local/sbin/ veya /usr/share/tsomtal-cron/

    • Cron tanımları /etc/cron.d/

    • Paket kurulumunda otomatik izinler, log dizinleri, vs.

    2.1. Dizin yapısı

    Bir çalışma klasörü açın:

    mkdir -p tsomtal-cron-etap_1.0.0/{DEBIAN,etc/cron.d,usr/local/sbin,usr/share/tsomtal-cron}

    2.2. DEBIAN/control

    nano tsomtal-cron-etap_1.0.0/DEBIAN/control
    Package: tsomtal-cron-etap Version: 1.0.0 Section: admin Priority: optional Architecture: all Maintainer: TSOMTAL <it@tsomtal.local> Depends: cron, systemd, sssd | winbind Description: TSOMTAL ETAP 23 cron policies (teacher/student group based) Installs group-aware cron wrapper and ETAP shutdown/maintenance schedules.

    2.3. Wrapper script’i pakete koyma

    Mevcut wrapper’ı kopyalayın:

    cp /usr/local/sbin/tsomtal-cron-ifingroup tsomtal-cron-etap_1.0.0/usr/local/sbin/tsomtal-cron-ifingroup

    2.4. Cron tanımlarını paket içine koyma

    Öğrenci politikası

    nano tsomtal-cron-etap_1.0.0/etc/cron.d/tsomtal-etap-ogrenci
    SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # Öğrenci: hafta içi 17:00 kapanış (ETAP_OGRENCI) 0 17 * * 1-5 root /usr/local/sbin/tsomtal-cron-ifingroup "ETAP_OGRENCI" /usr/sbin/poweroff

    Öğretmen politikası

    nano tsomtal-cron-etap_1.0.0/etc/cron.d/tsomtal-etap-ogretmen
    SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # Öğretmen: hafta içi 18:30 kapanış (ETAP_OGRETMEN) 30 18 * * 1-5 root /usr/local/sbin/tsomtal-cron-ifingroup "ETAP_OGRETMEN" /usr/sbin/poweroff

    2.5. Postinst (kurulum sonrası)

    nano tsomtal-cron-etap_1.0.0/DEBIAN/postinst
    #!/bin/bash set -e chmod 0755 /usr/local/sbin/tsomtal-cron-ifingroup systemctl restart cron || true exit 0

    Yetki verin:

    chmod 0755 tsomtal-cron-etap_1.0.0/DEBIAN/postinst

    2.6. Paketi derleme

    dpkg-deb --build tsomtal-cron-etap_1.0.0

    Çıktı:

    • tsomtal-cron-etap_1.0.0.deb

    Kurulum:

    sudo dpkg -i tsomtal-cron-etap_1.0.0.deb

    3) Hızlı Test ve Doğrulama

    Cron dosyaları okunuyor mu?

    sudo run-parts --test /etc/cron.daily

    Cron servis logları

    journalctl -u cron -n 100 --no-pager

    Wrapper test

    Aktif kullanıcı öğretmense:

    sudo /usr/local/sbin/tsomtal-cron-ifingroup "ETAP_OGRETMEN" /bin/echo "CALISTI"

    4) ETAP Sahada Pratik Öneri (çok önemli)

    Akıllı tahtalarda “kapanış” kritik iş olduğu için, cron yerine systemd timer daha güvenilir log ve hata takibi sağlar. Ama siz “paket uyumu ve basit dağıtım” istiyorsanız cron.d yaklaşımı çok iyi.

    • Tek cron dosyasıyla önce öğretmen grubunu kontrol edip değilse öğrenci kapanışı uygulayan “öncelik mantığı”

    • Hafta sonu farklı saat, tatil günleri “çalışma”

    • Samba AD OU’ya göre cihaz politikası (ör. Lab-1 erken kapanır, Öğretmenler Odası geç kapanır)

      Aşağıdaki çözüm tek bir /etc/cron.d dosyası ile çalışır; karar mantığını tek bir policy script içinde toplar:

      • Öncelik: Aktif oturum öğretmen grubundaysa öğretmen saatleri → değilse öğrenci saatleri

      • Hafta sonu farklı saatler

      • Tatil günleri: OU profiline göre çalış / çalışmasın

      • Cihaz OU’suna göre politika: (Lab-1 erken kapanır, Öğretmenler Odası geç kapanır vb.)

      • OU tespiti: AD’de bilgisayar hesabının distinguishedName (DN) bilgisini LDAP ile çekip OU’yu çıkarır.

      Varsayım: İstemciler domain’e katılı (SSSD/realmd veya winbind). LDAP sorgusu için Kerberos (GSSAPI) kullanıyoruz.


      1) Gerekli paketler

      sudo apt update sudo apt install -y cron ldap-utils krb5-user samba-common-bin

      2) Tatil listesi dosyası

      Tatil günlerini bu dosyaya koyacağız:

      sudo mkdir -p /etc/tsomtal sudo nano /etc/tsomtal/holidays.txt

      Örnek içerik (YYYY-MM-DD):

      2026-01-01 2026-04-23 2026-05-01 2026-05-19 2026-08-30 2026-10-29

      İsterseniz MEB tatillerini “okul takvimi”ne göre buraya ekleyebilirsiniz.


      3) OU tabanlı + grup öncelikli policy script

      sudo nano /usr/local/sbin/tsomtal-etap-shutdown-policy sudo chmod 0755 /usr/local/sbin/tsomtal-etap-shutdown-policy

      Aşağıdaki script’i aynen yapıştırın:

      #!/bin/bash # TSOMTAL ETAP 23 - OU + Grup Öncelikli Kapanış Politikası # Tek cron ile her dakika çalışır; zamanı gelince poweroff uygular. set -euo pipefail TEACHER_GROUP="ETAP_OGRETMEN" STUDENT_GROUP="ETAP_OGRENCI" HOLIDAY_FILE="/etc/tsomtal/holidays.txt" log(){ logger -t "tsomtal-etap-policy" "$*"; } now_date="$(date +%F)" dow="$(date +%u)" # 1=Mon ... 6=Sat 7=Sun hm="$(date +%H:%M)" # HH:MM # --- 1) Aktif kullanıcıyı bul (grafik oturum öncelikli) --- ACTIVE_USER="" while read -r sid _; do u="$(loginctl show-session "$sid" -p Name --value 2>/dev/null || true)" st="$(loginctl show-session "$sid" -p State --value 2>/dev/null || true)" ty="$(loginctl show-session "$sid" -p Type --value 2>/dev/null || true)" if [[ "$st" == "active" && ( "$ty" == "x11" || "$ty" == "wayland" ) ]]; then ACTIVE_USER="$u" break fi done < <(loginctl list-sessions --no-legend 2>/dev/null | awk '{print $1, $2}') # Grafik oturum yoksa da kapanış uygulayabilsin diye fallback (opsiyonel) if [[ -z "$ACTIVE_USER" ]]; then ACTIVE_USER="$(last -w | awk 'NF && $1 != "reboot" && $1 != "wtmp" {print $1; exit}')" fi # --- 2) Kullanıcı rolü: öğretmen mi? değilse öğrenci --- ROLE="student" if [[ -n "$ACTIVE_USER" ]] && id "$ACTIVE_USER" &>/dev/null; then if id -nG "$ACTIVE_USER" | tr ' ' '\n' | grep -Fxq "$TEACHER_GROUP"; then ROLE="teacher" elif id -nG "$ACTIVE_USER" | tr ' ' '\n' | grep -Fxq "$STUDENT_GROUP"; then ROLE="student" else # grubu yoksa varsayılan öğrenci kabul ediyoruz ROLE="student" fi fi # --- 3) Tatil mi? --- IS_HOLIDAY="no" if [[ -f "$HOLIDAY_FILE" ]] && grep -Fxq "$now_date" "$HOLIDAY_FILE"; then IS_HOLIDAY="yes" fi # --- 4) Cihazın OU’sunu AD’den çek (DN -> OU) --- # Kerberos ticket yoksa (cron ortamında) LDAP sorgusu başarısız olabilir. # Başarısız olursa OU="UNKNOWN" kalır ve default profile uygulanır. OU="UNKNOWN" HOST_FQDN="$(hostname -f 2>/dev/null || hostname)" DOMAIN="$(dnsdomainname 2>/dev/null || true)" HOST_SHORT="$(hostname -s 2>/dev/null || hostname)" BASE_DN="" if [[ -n "${DOMAIN:-}" ]]; then # example: tsomtal.com -> DC=tsomtal,DC=com BASE_DN="$(echo "$DOMAIN" | awk -F. '{for(i=1;i<=NF;i++) printf "DC=%s%s",$i,(i<NF?",":"") }')" fi DN="" if [[ -n "$BASE_DN" ]]; then # sAMAccountName bilgisayar$ şeklinde olur DN="$(ldapsearch -LLL -Y GSSAPI -b "$BASE_DN" "(&(objectClass=computer)(sAMAccountName=${HOST_SHORT}\$))" distinguishedName 2>/dev/null \ | awk -F': ' '/^distinguishedName:/{print $2; exit}' || true)" fi if [[ -n "$DN" ]]; then # DN içinden ilk OU’yu çıkar (OU=Lab-1,OU=ETAP,...) OU="$(echo "$DN" | tr ',' '\n' | awk -F= '$1=="OU"{print $2; exit}')" fi # --- 5) OU -> Profil (cihaz politikası) --- # Burayı okulunuza göre genişletin. PROFILE="DEFAULT" case "$OU" in "Lab-1"|"LAB-1"|"LAB1") PROFILE="LAB_EARLY" ;; "OgretmenlerOdasi"|"ÖğretmenlerOdası"|"TeachersRoom") PROFILE="TEACHERS_LATE" ;; "Kutuphane"|"Kütüphane") PROFILE="LIBRARY" ;; "UNKNOWN") PROFILE="DEFAULT" ;; *) PROFILE="DEFAULT" ;; esac # --- 6) Profil + gün tipi + rol -> kapanış saatleri / tatil davranışı --- # KURAL: Tek cron her dakika çalışır; hm eşleşirse kapanır. # WORK_ON_HOLIDAYS: yes ise tatilde de aynı (veya ayrı) saatler çalışır. WORK_ON_HOLIDAYS="no" # Default saatler STU_WEEKDAY="17:00" TEA_WEEKDAY="18:30" STU_WEEKEND="14:00" TEA_WEEKEND="15:00" case "$PROFILE" in "LAB_EARLY") STU_WEEKDAY="16:30" TEA_WEEKDAY="17:30" STU_WEEKEND="13:00" TEA_WEEKEND="13:30" WORK_ON_HOLIDAYS="yes" ;; "TEACHERS_LATE") STU_WEEKDAY="17:30" TEA_WEEKDAY="19:00" STU_WEEKEND="15:00" TEA_WEEKEND="16:00" WORK_ON_HOLIDAYS="no" ;; "LIBRARY") STU_WEEKDAY="17:00" TEA_WEEKDAY="18:00" STU_WEEKEND="12:30" TEA_WEEKEND="13:00" WORK_ON_HOLIDAYS="yes" ;; "DEFAULT") WORK_ON_HOLIDAYS="no" ;; esac # Tatilde çalışmayacaksa çık if [[ "$IS_HOLIDAY" == "yes" && "$WORK_ON_HOLIDAYS" == "no" ]]; then log "Tatil ($now_date). Profil=$PROFILE (OU=$OU). Tatilde çalışmıyor. Çıkılıyor." exit 0 fi # Gün tipi seç DAYTYPE="weekday" if [[ "$dow" == "6" || "$dow" == "7" ]]; then DAYTYPE="weekend" fi # Hedef saat belirle TARGET="" if [[ "$DAYTYPE" == "weekday" ]]; then [[ "$ROLE" == "teacher" ]] && TARGET="$TEA_WEEKDAY" || TARGET="$STU_WEEKDAY" else [[ "$ROLE" == "teacher" ]] && TARGET="$TEA_WEEKEND" || TARGET="$STU_WEEKEND" fi # --- 7) Zaman geldiyse güvenli kapanış --- if [[ "$hm" == "$TARGET" ]]; then log "KAPANIŞ: $HOST_FQDN OU=$OU Profil=$PROFILE Rol=$ROLE Gun=$DAYTYPE Tatil=$IS_HOLIDAY Saat=$hm" /usr/bin/wall "TSOMTAL: Sistem $TARGET itibariyle otomatik kapatılacak. Lütfen çalışmalarınızı kaydedin." sleep 30 /usr/sbin/poweroff fi exit 0

      OU eşleştirmeyi genişletmek için

      Script’teki şu bloğu çoğaltmanız yeterli:

      case "$OU" in "Lab-1"|"LAB-1"|"LAB1") PROFILE="LAB_EARLY" ;; "OgretmenlerOdasi"|... ) PROFILE="TEACHERS_LATE" ;; ... esac

      4) Tek cron.d dosyası

      sudo nano /etc/cron.d/tsomtal-etap-policy

      İçerik:

      SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin * * * * * root /usr/local/sbin/tsomtal-etap-shutdown-policy

      Cron’u yenileyin:

      sudo systemctl restart cron

      5) Kontrol / Log

      journalctl -t tsomtal-etap-policy -n 200 --no-pager

      OU sorgusu neden bazen çalışmayabilir?

      Cron ortamında Kerberos ticket yoksa ldapsearch -Y GSSAPI DN çekemeyebilir. Bu durumda iki pratik seçenek:

      1. Makine hesabıyla bind (LDAP bind kullanıcı/parola) — güvenli saklama gerekir

      2. OU’yu “cihaz etiketi” olarak /etc/tsomtal/device.profile dosyasına yazıp LDAP’ı devre dışı bırakmak (en stabil)

Yorumlar

Bu blogdaki popüler yayınlar

Android Telefon/Tablet Ekranını Pardus ETAP 23 Yüklü Akıllı Tahtaya Yansıtma

Pardus Etap 23’de Unutulmuş Etap Yetkili Parolasını Sıfırlama

Pardus Başlangıç Onarma