Bir komut dosyası aracılığıyla nasıl crontab oluştururum


153

Bir sunucu kurmak için çalıştırdığım bir komut dosyası aracılığıyla bir cron iş eklemek gerekir. Şu anda Ubuntu kullanıyorum. Kullanabilirim crontab -eama bu mevcut crontab'ı düzenlemek için bir editör açacaktır. Bunu programlı olarak yapmak istiyorum.

Bunu yapabilmek mümkün mü?




Bir crontab girişini değiştirmek veya silmek istiyorsanız, aşağıdaki çözümüme bakın.
Brian Smith

Yanıtlar:


11

Cron işleri genellikle kullanıcı başına bir dosyada /var/spool/cron

Yapmanız gereken en basit şey, muhtemelen iş yapılandırılmış bir metin dosyası oluşturmak, daha sonra cron biriktirme klasörüne kopyalamak ve doğru izinlere sahip olduğundan emin olmaktır (600).


20
Dosyaları doğrudan / var / spool / cron içinde değiştirmek kaşlarını çattı. Aslında, oradaki dosyalara bakarsanız, genellikle ilk satır olarak "BU DOSYAYI DÜZENLEME" gibi uyarılar içerirler.
Jared

12
@Jared Bu fikre oldukça katılıyorum, ancak "kaşlarını çattı" demek pek yardımcı olmuyor. Bunun yerine , varsa başka hangi dosyanın düzenlenmesi gerektiğini söyleyin veya dosyaları el ile düzenleme risklerini açıklayın. Otomatik komut satırı üzerinden bazı cron işleri oluşturmayı planlıyorum ve bu dosyayı düzenlemek hem de tek seçenek ise ve önemli yan etkileri olmadan, neden kullanmamam gerektiğini görmüyorum.
Balmipour

47
Gerçek cevap için aşağı kaydırın.
John Red

1
Bence bu cevap çok daha iyi: stackoverflow.com/a/610860/2681752
galaux

2
Bu yaklaşımı alıp pişman oldum. RHEL üzerinde / var / spool / cron dizini dünya tarafından yürütülebilir değildir, bu nedenle kullanıcılar dizini geçemez ve dosyalarını el ile düzenleyemez. / Var / spool / cron dünyasını çalıştırılabilir yaparsanız, dost yerel sistem yöneticiniz size kızar, ayrıca cronie paketi yeniden yüklenir veya güncellenirse izin değişikliğinin üzerine yazılabilir.
functionvoid

384

Yeni işi bir dosyada kullanmayan / gerektirmeyen bir astar:

(crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab -

2>/dev/nullEğer alamadım bu yüzden önemlidir no crontab for usernameŞu anda crontab giriş varsa bazı * nixes ürettiğini mesajı.


14
Bu kabul edilen cevap olmalı. Eklemek istediğim tek astarın zaten orada olup olmadığını kontrol etmek için şimdi bir yola ihtiyacım var ...
ChrisPrime

7
... oh bekleyin, bir komut dosyası ile eklemeden önce bir şeyin kullanıcının crontab'ında olup olmadığını nasıl kontrol
edersiniz

1
bu komut dosyasının tekrarlanması ve varolan bir cron görevini değiştirmesi için bir komut olması isteniyorsa, crontab'daki varolan satırı değiştirmek iyi olabilir. farklı cron görevlerini kontrol etmek için birkaç işaretleyici kullanılabilir (kontrol işaretleyici-1, kontrol işaretleyici-2, vb ...): (crontab -l 2> / dev / null | grep -v kontrol işaretleyici-1; eko '* / 5 * * * * / argüman ile / iş -göstergesi ile # control-marker-1') | crontab -
şef

7
Bunun mevcut crontab girişlerini kaldırdığını buldum ve ayrıca farklı bir kullanıcı (kök) kullanmam gerekiyordu, bu yüzden mevcut girişleri korumak için aşağıdakileri kullandım: echo -e "$(sudo crontab -u root -l)\n* * * * * echo hello > /home/danny/temp.log 2>&1" | sudo crontab -u root -Umarım bu birine yardımcı olur
Danny

60

Kullanıcı crontabs (kök dahil) için aşağıdakileri yapabilirsiniz:

crontab -l -u user | cat - filename | crontab -u user -

burada "dosyaadı" adlı dosya eklenecek öğeleri içerir. Metin manipülasyonunu sedveya yerine başka bir araç kullanarak da yapabilirsiniz cat. Kullanmalısıncrontab dosyayı doğrudan değiştirmek yerine komutu.

Benzer bir işlem şöyle olur:

{ crontab -l -u user; echo 'crontab spec'; } | crontab -u user -

Sistem kısaltmaları değiştiriyorsanız veya oluşturuyorsanız, bunlar normal metin dosyalarında yaptığınız gibi değiştirilebilir. Onlar saklanır /etc/cron.d, /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthlydizinleri ve dosyaları /etc/crontabve /etc/anacrontab.


Umut verici görünüyordu ama ikinci yaklaşımı (ile echo) çalışırken, "crontab: kullanım hatası: dosya adı değiştirmek için belirtilmelidir." Cron man sayfası sözdizimini crontab [ -u user ] file, yani zorunlu bir dosya adıyla gösterir. Bunun yerine borulu verileri kabul etmesinin bir yolu var mı?
Mark Berry

1
@ MarkBerry: Bunun için üzgünüm. Bir boruda, girdinin geldiğini belirtmek için bir kısa çizgi kullanılmalıdır stdin. Cevabımı düzeltirim.
sonraki duyuruya kadar duraklatıldı.

29

Ubuntu ve diğer birçok dağıtımda, /etc/cron.dgeçerli bir crontab ile tek bir satır içeren dizine bir dosya koyabilirsiniz girişi . Varolan bir dosyaya satır eklemenize gerek yoktur.

Her gün çalıştırmak için bir şeye ihtiyacınız varsa, içine bir dosya koyun /etc/cron.daily. Aynı şekilde, ayrıca içine dosyaları bırakın /etc/cron.hourly, /etc/cron.monthlyve /etc/cron.weekly.


5
Ama bunu yapmak için kök olmalısınız.
Keith

17

Sorunuza daha da basit bir cevap olacaktır:

echo "0 1 * * * /root/test.sh" | tee -a /var/spool/cron/root

Cronjobs'u uzak sunucularda aşağıdaki gibi kurabilirsiniz:

#!/bin/bash
servers="srv1 srv2 srv3 srv4 srv5"
for i in $servers
  do
  echo "0 1 * * * /root/test.sh" | ssh $i " tee -a /var/spool/cron/root"
done

Linux'ta, crontabdosyanın varsayılan konumu /var/spool/cron/. Burada crontabtüm kullanıcıların dosyalarını bulabilirsiniz . Sadece cronjob girişinizi ilgili kullanıcının dosyasına eklemeniz yeterlidir. Yukarıdaki örnekte, kök kullanıcının crontab dosyasına, /root/test.shher gün saat 01: 00'de çalışması için bir cronjob eklenir .


Bu /var/spool/cron/crontabs/rootUbuntu'da olurdu .
Méhor Mé

17

Crontab dosyaları basitçe metin dosyalarıdır ve diğer metin dosyaları gibi işlenebilir. crontabKomutun amacı, crontab dosyalarını düzenlemeyi daha güvenli hale getirmektir. Bu komutla düzenlendiğinde, dosya hatalara karşı kontrol edilir ve yalnızca hiçbiri yoksa kaydedilir.

crontab [path to file]bir dosyada saklanan bir crontab belirtmek için kullanılabilir. Sevmekcrontab -e , bu sadece dosyayı hatasız olarak kuracaktır.

Bu nedenle, bir komut dosyası doğrudan cron sekmesi dosyalarını yazabilir veya geçici bir dosyaya yazıp crontab [path to temp file]komutla yükleyebilir . Yazmak, geçici bir dosya yazmak zorunda kalmadan doğrudan tasarruf sağlar, ancak güvenlik kontrolünü de önler.


2
crontab [path to file]Benim gibi noobs için, bunun olduğunu unutmayın .. Daha okunaklı kod izin verdiği için, bu kesinlikle benim için en iyi seçenek oldu. Parselleri izlemek ve masaüstü duvar kağıdımı durumla değiştirmek için crontab kullanıyorum. Parsel beklemediğimde, her saat kontrol edilmesi gerekmez. Bu yüzden betiğin cron frekansını otomatik olarak düzenlemesini istedim.
Rasmus

1
@Rasmus Kulağa çalmayı çok sevdiğim harika bir senaryo gibi geliyor. Bir öz veya benzeri yoluyla paylaşım şansı var mı?
cledoux

8

(Yorum yapmak için yeterli itibarım yok, bu yüzden bir cevap olarak ekliyorum: cevabının yanında yorum olarak eklemek için çekinmeyin)

Joe Casadonte'nin tek kalemi mükemmelset -e , yani senaryonun hataya başarısız olacak şekilde ayarlanmış olması ve henüz cronjobs olmaması dışında. Bu durumda, tek satırlı cronjob OLUŞMAZ, ancak komut dosyasını durdurmaz. Sessiz başarısızlık çok yanıltıcı olabilir.

Bunun nedeni ise crontab -lbir ile döner 1müteakip komutu neden dönüş kodu, (echo ) yürütülmemesine ... dolayısıyla cronjob yaratılmaz. Ancak alt süreç olarak yürütüldüklerinden (parantez nedeniyle) komut dosyasını durdurmazlar.

Eğer idam sonra: (Tekrar aynı komutu çalıştırırsanız İlginçtir, işe yarayacak crontab -bir kez crontab -lsen alamadım (hala çıkışlar şey, ama artık bir hata döndürmez no crontab for <user>) artık mesaj müteakip Yani. echoYürütülür ve crontab oluşturulur)

Her durumda, ile çalışırsanız set -e, çizgi şöyle olmalıdır:

(crontab -l 2>/dev/null || true; echo "*/5 * * * * /path/to/job -with args") | crontab -

Evet, bu daha da mükemmel.
Yngve Sneen Lindal

7

Şunu önerenler için bir düzeltme olarak crontab -l | crontab -: Bu her sistemde çalışmaz. Örneğin, eski bir SUSE sürümü çalıştıran düzinelerce sunucuda kök crontab'a bir iş eklemek zorunda kaldım (nedenini sorma). Eski SUSE'ler, açıklama satırlarının çıktısını, idempotent olmayan crontab -lhale getirir crontab -l | crontab -(Debian, crontab man sayfasında bu sorunu tanır ve varsayılan davranışını değiştirmek için Vixie Cron sürümünü yamalı crontab -l).

crontab -lYorum ekleyen sistemlerde crontab'ları programlı olarak düzenlemek için aşağıdakileri deneyebilirsiniz:

EDITOR=cat crontab -e > old_crontab; cat old_crontab new_job | crontab -

EDITOR=catcrontab'a cat, dosyayı değiştirmeyen ancak bunun yerine stdout'a kopyalayan bir editör (normal varsayılan vi değil) olarak kullanmasını söyler . crontab -Girilen crontab -eçıktılardan farklı bir biçimde girdi beklenirse bu yine de başarısız olabilir . Finalini değiştirmeye kalkmayın crontab -ile crontab -e- bu iş olmaz.


4

Eh /etc/crontabsadece bir ASCII dosya yüzden en basit sadece etmektir

 echo "*/15 * * * *   root     date" >> /etc/crontab

bu da size her 15 dakikada bir e-posta gönderecek bir iş ekleyecektir. Zevkinize göre ayarlayın ve grepkodunuzu idempotent yapmak için satırın zaten eklenmiş olup olmadığını test edin.

Ubuntu ve diğerlerinde, /etc/cron.*yapması daha kolay olan dosyaları bırakıp --- test edebilir ve ayrıca gibi (sistem) yapılandırma dosyaları ile uğraşmazsınız /etc/crontab.


1
Gerçekte çoğu uygulamada bile crontab'daki değişiklikleri izlemek için teknik olarak crond'ın gerekli olmadığını düşünüyorum, bu yüzden daha sonra bunu prod için crontab -e'ye çağırmanızı öneririm. crontab -e, bellek hizmet veriyorsa EDITOR değişkenini onurlandırır; bu nedenle, an için / bin / true olarak ayarlanması, yalnızca crontab'ı yeniden okunmaya zorlamalıdır.
Ulrich Schwarz

1
Gerçek henüz herhangi yeni Linux sistemi üzerinde crond yaptığı monitörü ve kesinlikle OP'ın belirtilen platformunda yapar.
Dirk Eddelbuettel

Yalnızca root iseniz ve komut dosyasının root olarak çalışmasını istiyorsanız. Bu OP'ler durumunda istenmeyebilir.
Keith

Öyle değil, / etc / crontab'da kök olmayan girdiler var. Dosyaya eklemek için 'sudo'ya ihtiyacınız var. Her neyse, belirttiğim gibi, /etc/cron.*/ var ama orada yazmak için de kök olmanız gerekiyor.
Dirk Eddelbuettel

2

İşte cron dosyasını (kaşlarını çatmış olan) doğrudan düzenlemeden cron girdisini nasıl değiştireceğiniz aşağıda açıklanmıştır.

crontab -l -u <user> | sed 's/find/replace/g' | crontab -u <user> -

Bir cron girişini kaldırmak istiyorsanız, şunu kullanın:

crontab -l -u <user> | sed '/find/d' | crontab -u <user> -

Bunun gaurav'ın istediği şey olmadığını anlıyorum, ama neden tüm çözümleri tek bir yerde bulamıyoruz?


1

Python'da bir crontab konuşlandırma aracı yazdım: https://github.com/monklof/deploycron

pip install deploycron

Crontab'ınızı kurmak çok kolaydır, bu crontab'ı sistemin mevcut crontab'ına birleştirir.

from deploycron import deploycron
deploycron(content="* * * * * echo hello > /tmp/hello")

1

Bu, cron işini aşamalı olarak eklemek için bir yaklaşımdır:

  ssh USER_NAME@$PRODUCT_IP nohup "echo '*/2 * * * * ping -c2 PRODUCT_NAME.com >> /var/www/html/test.html' | crontab -u USER_NAME -"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.