cron - cron


cron
Geliştirici(ler) AT&T Bell Laboratuvarları
İlk sürüm Mayıs 1975 ; 46 yıl önce ( 1975-05 )
Yazılmış C
İşletim sistemi Linux , macOS , FreeBSD
Tip İş zamanlayıcı

Cron olarak da bilinen komut satırı yardımcı programı, cron işi bir olan iş zamanlayıcı üzerinde Unix benzeri işletim sistemleri . Yazılım ortamlarını kuran ve bakımını yapan kullanıcılar, işleri (komutlar veya kabuk komut dosyaları ) belirli zamanlarda, tarihlerde veya aralıklarla düzenli aralıklarla çalışacak şekilde planlamak için cron'u kullanır . Genellikle sistem bakımını veya yönetimini otomatikleştirir, ancak genel amaçlı doğası onu İnternet'ten dosya indirmek ve düzenli aralıklarla e-posta indirmek gibi şeyler için faydalı kılar .

Cron, tekrarlayan görevleri zamanlamak için en uygun olanıdır. Bir kerelik görevlerin zamanlanması, ilişkili at yardımcı programı kullanılarak gerçekleştirilebilir .

genel bakış

Cron'un eylemleri, belirli bir programda periyodik olarak çalışacak kabuk komutlarını belirten bir yapılandırma dosyası olan bir crontab (cron tablosu) dosyası tarafından yürütülür. Crontab dosyaları, iş listelerinin ve cron arka plan programına yönelik diğer talimatların tutulduğu yerde saklanır. Kullanıcılar kendi bireysel crontab dosyalarına sahip olabilir ve genellikle yalnızca sistem yöneticilerinin düzenleyebileceği sistem çapında bir crontab dosyası (genellikle içinde veya bir alt dizini ) bulunur. /etc/etc

Bir crontab dosyasının her satırı bir işi temsil eder ve şöyle görünür:

# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │                                   7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * <command to execute>

Her satırın sözdizimi, komutun yürütüleceği zamanı temsil eden beş alandan oluşan bir cron ifadesi ve ardından yürütülecek bir kabuk komutu bekler.

Normalde iş, saat/tarih belirtim alanlarının tümü geçerli saat ve tarihle eşleştiğinde yürütülürken, bir istisna vardır: hem "ayın günü" (alan 3) hem de "haftanın günü" (alan 5) kısıtlanmışsa ( "*") değil, o zaman bir veya her ikisi de geçerli günle eşleşmelidir.

Örneğin, cron kullanıcısı için varsayılan kabuğun Bourne kabuğu uyumlu olduğunu varsayarak, aşağıdakiler her gün gece yarısından (00:01) bir dakika sonra Apache hata günlüğünü temizler :

1 0 * * * printf "" > /var/log/apache/error_log

Bu örnek, her Cumartesi 23:45'te (23:45 PM) export_dump.sh adlı bir kabuk programını çalıştırır.

45 23 * * 6 /home/oracle/scripts/export_dump.sh

Not: belirtmek de mümkündür */nher aday n zaman -th aralığına. Ayrıca, birden çok belirli zaman aralığı belirtmek virgülle yapılabilir (örn., 1,2,3). Aşağıdaki komut satırına her birinci, ikinci ve üçüncü saatte bir (yani 01:00, 01:05, 01:10, 03:55'e kadar) her 5 dakikada bir komut satırına "merhaba dünya" çıktısı verir.

*/5 1,2,3 * * * echo hello world

Bir kullanıcının yapılandırma dosyası crontab -e, gerçek uygulamanın bu dosyayı nerede sakladığına bakılmaksızın çağrılarak düzenlenebilir .

Paul Vixie tarafından yazılan ve birçok Linux dağıtımında cronbulunan popüler 4. BSD baskısı gibi bazı uygulamalar altıncı bir alan ekler: belirtilen işi çalıştıran bir hesap kullanıcı adı (kullanıcı varlığına ve izinlerine tabidir). Buna yalnızca sistem crontab'larında izin verilir; her biri yapılandırmak için tek bir kullanıcıya atanan diğerlerinde izin verilmez. Altıncı alan alternatif olarak bazen bir hesap kullanıcı adı yerine yıl için kullanılır; bunu Windows için nncron arka plan programı yapar.

Cron'un Amazon EventBridge uygulaması haftanın 0 tabanlı gününü kullanmaz, bunun yerine 1-7 SUN-SAT (0-6 yerine) ve ayrıca ilk hafta içi ve son gün gibi ek ifade özelliklerini destekler. -ay.

Standart olmayan önceden tanımlanmış zamanlama tanımları

Bazı cron uygulamaları aşağıdaki standart olmayan makroları destekler:

giriş Açıklama Eşittir
@yearly (or @annually) 1 Ocak gece yarısında yılda bir kez çalıştırın 0 0 1 1 *
@monthly Ayda bir kez, ayın ilk gününün gece yarısında çalıştırın 0 0 1 * *
@weekly Haftada bir Pazar sabahı gece yarısı koşun 0 0 * * 0
@daily (or @midnight) Günde bir kez gece yarısı koşun 0 0 * * *
@hourly Saat başında saatte bir çalıştırın 0 * * * *
@reboot Başlangıçta çalıştır Yok

@rebootbir işi arka plan programı başlatıldığında bir kez çalışacak şekilde yapılandırır. Cron tipik olarak hiçbir zaman yeniden başlatılmadığından, bu genellikle önyüklenen makineye karşılık gelir. Bu davranış, Debian'da sağlananlar gibi bazı cron varyasyonlarında uygulanır , böylece arka plan programının yeniden başlatılması @rebootişleri yeniden çalıştırmaz .

@rebootbelirli bir kullanıcı altında bir sunucu veya arka plan programı başlatma ihtiyacı varsa ve kullanıcının programı başlatmak için init yapılandırmasına erişimi yoksa yararlı olabilir .

Cron izinleri

Bu iki dosya önemli bir rol oynar:

  • /etc/cron.allow - Bu dosya varsa, o kullanıcının cron işlerini kullanmasına izin verilmesi için kullanıcının adını içermesi gerekir.
  • /etc/cron.deny - cron.allow dosyası yoksa ancak /etc/cron.deny dosyası varsa, cron işlerini kullanmak için kullanıcılar /etc/cron.deny dosyasında listelenmemelidir.

Bu dosyalardan hiçbiri yoksa, siteye bağlı yapılandırma parametrelerine bağlı olarak, yalnızca süper kullanıcının cron işlerini kullanabileceğini veya tüm kullanıcıların cron işlerini kullanabileceğini unutmayın.

Saat dilimi işleme

Çoğu cron uygulaması, cron arka plan programının altında çalıştığı sistem saat dilimi ayarındaki crontab girişlerini basitçe yorumlar. Çok kullanıcılı büyük bir makinenin birkaç saat diliminde kullanıcıları varsa, özellikle de sistem varsayılan saat dilimi potansiyel olarak kafa karıştırıcı DST içeriyorsa, bu bir anlaşmazlık kaynağı olabilir . Bu nedenle, bir cron uygulaması, özel bir durum olarak, kullanıcı crontab'larında "CRON_TZ=<zaman dilimi>" biçimindeki satırları tanıyabilir ve bu zaman dilimine göre sonraki crontab girişlerini yorumlayabilir.

Tarih

Erken sürümler

Sürüm 7 Unix'teki cron , işletim sistemi çok kullanıcılı moda girdiğinde çağrılan bir sistem hizmetiydi (daha sonra arka plan programı olarak adlandırıldı ) /etc/rc. Onun algoritması basit:

  1. Okumak /usr/lib/crontab
  2. Geçerli tarih ve saatte herhangi bir komutun çalıştırılması gerekip gerekmediğini belirleyin ve öyleyse bunları süper kullanıcı , root olarak çalıştırın .
  3. Bir dakika uyu
  4. 1. adımdan itibaren tekrarlayın.

Bu cron sürümü basit ve sağlamdı, ancak yapacak herhangi bir iş bulsa da bulmasa da kaynakları tüketiyordu. Purdue Üniversitesi'nde 1970'lerin sonlarında cron hizmetini zaman paylaşımlı bir VAX üzerindeki 100 kullanıcının tümüne genişletmek için yapılan bir deneyde , sisteme çok fazla yük bindirdiği bulundu.

Çok kullanıcılı yetenek

Unix System V'in piyasaya sürülmesiyle birlikte cron'un bir sonraki sürümü, cron'un yeteneklerini yalnızca süper kullanıcıya değil, bir Unix sisteminin tüm kullanıcılarına genişletmek için oluşturuldu. Güçlü işlemcilere ve az sayıda kullanıcıya sahip çoğu Unix ve Unix benzeri sistemlerde bu bugün önemsiz görünse de, o zamanlar kabaca 100 kullanıcı hesabına sahip tek MIPS sisteminde yeni bir yaklaşım gerektiriyordu .

ACM Communications'ın Ağustos 1977 sayısında , WR Franta ve Kurt Maly, "Simülasyon olay seti için verimli bir veri yapısı" başlıklı bir makale yayınladı ve " yaygın olarak kullanılan basit bağlantılı liste algoritmalarından daha üstün performans", düzgün olmayan zaman dağılımları verilen iyi davranış ve en kötü durum karmaşıklığı , "n" kuyruktaki olay sayısıdır.

Bir Purdue lisansüstü öğrencisi olan Robert Brown, bu makaleyi gözden geçirdi, cron ve ayrık olay simülatörleri arasındaki paralelliği fark etti ve deney için Franta-Maly olay listesi yöneticisinin (ELM) bir uygulamasını yarattı. Ayrık olay simülatörleri sanal zamanda çalışır , olayları olay kuyruğundan olabildiğince çabuk çıkarır ve "şimdi" kavramını bir sonraki olayın planlanan zamanına ilerletir. Olay simülatörünü sanal zaman yerine "gerçek zamanlı" çalıştırmak, zamanının çoğunu uyuyarak geçiren ve olay listesinin başındaki görevi yürütmek için planlanan zamanı bekleyen bir cron sürümü yarattı.

Takip eden okul yılı, Purdue'daki yüksek lisans programına Bilgisayar Bilimleri bölümündeki sistem personeline katılan Keith Williamson da dahil olmak üzere yeni öğrenciler getirdi. Bir "ısınma görevi" olarak Brown, prototip cron'u bir üretim hizmetine dönüştürmesini istedi ve bu çok kullanıcılı cron, 1979'un sonlarında Purdue'da kullanıma girdi. Bu cron sürümü /etc/cron, bilgisayarda kullanılanın tamamen yerini aldı. bilim bölümünün VAX 11/780'i 32/V çalıştırıyor.

Bu cron tarafından kullanılan algoritma aşağıdaki gibidir:

  1. Başlangıçta .crontab, tüm hesap sahiplerinin ana dizinlerinde adlandırılmış bir dosya arayın .
  2. Bulunan her crontab dosyası için, gelecekte her bir komutun çalıştırılması gereken zamanı belirleyin.
  3. Bu komutları karşılık gelen zamanları ve "beş alan" zaman belirteci ile Franta–Maly olay listesine yerleştirin.
  4. Ana döngüye girin:
    1. Kuyruğun başındaki görev girişini inceleyin, gelecekte ne kadar çalışması gerektiğini hesaplayın.
    2. O süre boyunca uyuyun.
    3. Uyandığında ve doğru zamanı doğruladıktan sonra, görevi, onu oluşturan kullanıcının ayrıcalıklarıyla kuyruğun başında (arka planda) yürütün.
    4. Gelecekte bu komutu çalıştırmak için bir sonraki zamanı belirleyin ve o zaman değerinde tekrar olay listesine yerleştirin.

Ek olarak, arka plan programı değiştirilmiş crontab dosyalarını yeniden taramak için SIGHUP sinyallerine yanıt verir ve değiştirilmiş crontab dosyalarını aramak için saat ve yarım saatte özel "uyandırma olayları" planlar. Burada, hepsi bu cron'daki kod satırlarının çoğunu oluşturan bilgisayar günün saati takibi, Unix alarm planlaması, günün açık saati değişiklikleri ve süreç yönetimi ile ilgili yanlışlıklar hakkında çok fazla ayrıntı atlanmıştır. Bu cron ayrıca stdout ve stderr çıktılarını da yakaladı ve herhangi bir çıktıyı crontab sahibine e-postayla gönderdi.

Bu cron tarafından tüketilen kaynaklar, yalnızca verilen iş miktarı ile ölçeklenir ve değişiklikleri periyodik olarak kontrol etme dışında, zamanla doğal olarak artmaz.

Williamson eğitimini tamamladı ve Bilgisayar Bilimi alanında Yüksek Lisans derecesi ile Üniversiteden ayrıldı ve New Jersey Murray Hill'deki AT&T Bell Laboratuvarlarına katıldı ve bu cron'u yanına aldı. Bell Laboratuarlarında, o ve diğerleri, Unix atkomutunu cron'a dahil ettiler , crontab dosyalarını kullanıcıların ana dizinlerinden (ana bilgisayara özgü olmayan) ve ortak bir ana bilgisayara özel biriktirme dizinine taşıdılar ve zorunlu crontabolarak izin vermek için komutu eklediler. kullanıcıların crontab'larını bu biriktirme dizinine kopyalamaları gerekir.

Cron bu sürümü de büyük ölçüde değişmeden çıktı Unix System V ve BSD ve onların türevleri, içinde Solaris dan Sun Microsystems , IRIX gelen Silicon Graphics , HP-UX dan Hewlett-Packard ve AIX gelen IBM . Teknik olarak, bu uygulamalar için orijinal lisans, çalışmayı finanse eden Purdue Araştırma Vakfı'na ait olmalıdır, ancak bu, bu tür konulara çok az ilgi gösterildiği bir zamanda gerçekleşti.

Modern versiyonlar

GNU Projesi ve Linux'un ortaya çıkmasıyla birlikte yeni cron'lar ortaya çıktı. Bunlardan en yaygın olanı, orijinal olarak 1987'de Paul Vixie tarafından kodlanan Vixie cron'dur . Vixie cron'un 3. Sürümü 1993'ün sonlarında yayınlandı. Sürüm 4.1, ISC Cron olarak yeniden adlandırıldı ve Ocak 2004'te yayınlandı. Sürüm 3, bazı küçük hata düzeltmeleriyle birlikte , Linux ve BSD'lerin çoğu dağıtımında kullanılır.

2007'de Red Hat, vixie -cron 4.1'i cronie projesine çatalladı ve 2009'da anacron 2.3'ü dahil etti .

Diğer popüler uygulamalar arasında anacron ve dcron bulunur. Ancak anacron bağımsız bir cron programı değildir. Başka bir cron işi onu çağırmalıdır. dcron, DragonFly BSD kurucusu Matt Dillon tarafından yapıldı ve bakımı 2010 yılında Jim Pryor tarafından devralındı.

2003 yılında Dale Mellor, yazılmış bir cron varyantını mcron tanıtıldı Guile bu sallama izin verdiği de daha fazla esneklik sağlarken Vixie cron ile çapraz uyumluluk sağlar şeması kod zamanlama hesaplamaları ve iş tanımlarında kullanılacak. (Mcron ayrıca geleneksel Vixie crontab dosyalarına kabul olsa da) mcron cin ve crontab dosyaları hem genelde düzeninde yazılmış olduğundan, birikimli devlet bir kullanıcının işi sıranın çalıştırmak için planlanmış olabilir işlerini kodu kullanılabilir IFF diğer sonuçlarına işler belirli kriterleri karşılamaktadır. Mcron altında varsayılan olarak dağıtıldığı Guix hükümleri (içerir paket yöneticisi, hizmetler için paket yöneticisi için) monadik hem iş yürütülmesi için gerekli paketler yüklü olduğunu ve ilgili crontabs doğru onlara bakın sağlarken yayarlar mcron crontabs.

Bir webcron çözümü , bir web barındırma ortamında cron uygulamalarının bulunmadığı her yerde halka görevlerini düzenli olarak çalışacak şekilde zamanlar .

CRON ifadesi

Bir CRON ifadesi, normalde bir rutini yürütmek için bir zamanlama olarak, bir dizi zamanı temsil eden, beyaz boşlukla ayrılmış beş veya altı alandan oluşan bir dizedir.

Yorumlar bir yorum işareti # ile başlar ve kendi başlarına bir satırda olmalıdır.

Alan Gerekli İzin verilen değerler İzin verilen özel karakterler Uyarılar
dakika Evet 0–59 * , -
Saat Evet 0–23 * , -
Ayın günü Evet 1-31 * , - ? L W ? L W sadece bazı uygulamalarda
Ay Evet 1–12 veya OCAK–ARALIK * , -
Haftanın günü Evet 0–6 veya SUN–SAT * , - ? L # ? L # sadece bazı uygulamalarda
Yıl Numara 1970-2099 * , - Bu alan standart/varsayılan uygulamalarda desteklenmez.

Ay ve hafta içi kısaltmaları büyük/küçük harfe duyarlı değildir.

Sistem crontab dosyasının (/etc/crontab) özel durumunda , komuttan önce bir kullanıcı alanı kendini ekler . Genellikle 'kök' olarak ayarlanır.

CRON formatının bazı kullanımlarında , kalıbın başında bir saniye alanı da vardır . Bu durumda, CRON ifadesi 6 veya 7 alandan oluşan bir dizedir.

Virgül ( ,)
Virgül, bir listenin öğelerini ayırmak için kullanılır. Örneğin 5. alanda (haftanın günü) "Pzt,Çarş,Cuma" kullanılması Pazartesi, Çarşamba ve Cuma günleri anlamına gelir.
Kısa çizgi ( -)
Dash aralıkları tanımlar. Örneğin, 2000–2010, 2000 ile 2010 (dahil) arasındaki her yılı belirtir.
Yüzde ( %)
Komuttaki yüzde işaretleri (%), ters eğik çizgi (\) ile çıkılmadığı sürece yeni satır karakterlerine dönüştürülür ve ilk %'den sonraki tüm veriler komuta standart girdi olarak gönderilir.

Standart olmayan karakterler

Aşağıdakiler standart olmayan karakterlerdir ve yalnızca Quartz Java zamanlayıcı gibi bazı cron uygulamalarında bulunur .

L
'L', "son" anlamına gelir. Haftanın günü alanında kullanıldığında, belirli bir ayın "son Cuması" (" 5L ") gibi yapıların belirtilmesine izin verir . Ayın günü alanında ayın son gününü belirtir.
W
Ayın günü alanı için 'W' karakterine izin verilir. Bu karakter, verilen güne en yakın haftanın gününü (Pazartesi-Cuma) belirtmek için kullanılır. Örnek olarak, ayın günü alanı için değer olarak " 15W " belirtilirse, bunun anlamı şudur: "hafta içi ayın 15'ine en yakın gün." Yani, 15'i Cumartesi ise, tetikleyici 14'ü Cuma günü tetiklenir. 15'i Pazar ise, tetikleyici 16'sı Pazartesi günü tetiklenir. 15'i Salı ise, 15'i Salı günü ateşlenir. Bununla birlikte, ayın günü değeri olarak "1W" belirtilirse ve 1. Cumartesi ise, tetikleyici, ayın günlerinin sınırını 'zıplamadığı' için 3'ü Pazartesi günü tetiklenir. 'W' karakteri yalnızca ayın günü tek bir gün olduğunda belirtilebilir, bir aralık veya gün listesi değil.
Karma ( #)
Haftanın günü alanı için '#' kullanılabilir ve ardından bir ile beş arasında bir sayı gelmelidir. Belirli bir ayın "ikinci Cuması" gibi yapıların belirlenmesine izin verir. Örneğin, haftanın günü alanına "5#3" girilmesi, her ayın üçüncü Cuma gününe karşılık gelir.
Soru işareti ( ?)
Bazı uygulamalarda, ayın gününü veya haftanın gününü boş bırakmak için ' * ' yerine kullanılır . Diğer cron uygulamaları "?" yerine cron arka plan programının başlangıç ​​zamanı ile, böylece cron sabah 8:25'te başlatılırsa ? ? * * * *güncellenir 25 8 * * * *ve yeniden başlatılıncaya kadar her gün bu saatte çalışır.
Eğik çizgi ( /)
Vixie-cron'da eğik çizgiler, adım değerlerini belirtmek için aralıklarla birleştirilebilir. Örneğin , dakika alanındaki */5 her 5 dakikada bir anlamına gelir (frekanslarla ilgili aşağıdaki nota bakın). Daha ayrıntılı POSIX formu 5,10,15,20,25,30,35,40,45,50,55,00 . POSIX, eğik çizgiler için bir kullanım tanımlamaz; gerekçesi (bir BSD uzantısı hakkında yorum), tanımın System V formatına dayandığını, ancak uzantı olasılığını dışlamadığını belirtir.

Genel olarak frekansların ifade edilemeyeceğini unutmayın; yalnızca aralıklarını eşit olarak bölen adım değerleri doğru frekansları ifade eder (dakika ve saniye için, bu /2, /3, /4, /5, /6, /10, /12, /15, /20 ve /30'dur çünkü 60 bu sayılarla eşit olarak bölünebilir; saat için, bu /2, /3, /4, /6, /8 ve /12 ); tüm diğer olası "adımlar" ve diğer tüm alanlar, zaman biriminin sonunda bir sonraki dakika, saniye veya güne "sıfırlanmadan" önce tutarsız "kısa" süreler verir; örneğin, gün alanına */5 girilmesi bazen aya ve artık yıla bağlı olarak 1, 2 veya 3 gün sonra yürütülür; bunun nedeni, cron'un durumsuz olmasıdır (son yürütmenin zamanını hatırlamaz veya doğru frekans sayımı için gerekli olan ve şimdi ile şimdi arasındaki farkı saymaz - bunun yerine, cron yalnızca bir model eşleştiricidir).

H
'H', Jenkins sürekli entegrasyon sisteminde "karma" bir değerin ikame edildiğini belirtmek için kullanılır . Bu nedenle 20 * * * *, her saat başı 20 dakika sonra anlamına gelen " " gibi sabit bir sayı yerine " H * * * *", görevin her saat başı belirtilmemiş ancak her görev için değişmez bir zamanda gerçekleştirildiğini gösterir. Bu, hepsinin aynı anda başlaması ve kaynaklar için rekabet etmesi yerine görevleri zamana yaymaya izin verir.

Ayrıca bakınız

Referanslar

Dış bağlantılar