Neden crontab scriptleri çalışmıyor?


525

Genellikle, crontabkomut dosyaları zamanlamaya göre veya beklendiği gibi yürütülmez. Bunun çok sayıda nedeni var:

  1. yanlış crontab notasyonu
  2. izin sorunu
  3. Ortam Değişkenleri

Bu topluluk wiki'si, crontabkomut dosyalarının beklendiği gibi yürütülmemesinin en önemli nedenlerini toplamayı hedefliyor . Her sebebi ayrı bir cevaba yazınız.

Lütfen her cevap için bir neden ekleyin - neden yürütülmediğinin ayrıntıları - ve bu nedenden dolayı düzeltin.

Lütfen yalnızca cron'a özgü sorunları yazın; örneğin, kabuktan beklendiği gibi çalıştıran ancak cron tarafından hatalı şekilde yürütülen komutlar.


12
Cron'un etkili olması için kapatmalısın crontab -e. Örneğin, vim kullanarak dosyayı düzenlerim ve :wyazmak için kullanırım , ancak istifa edene kadar iş cron'a eklenmez. Bu yüzden ben de işi sonrasına kadar görmeyeceğim :q.
DutGRIFF

Ben cron hata ayıklamak için en iyi yolu syslog kontrol ve sorunları bulmak olduğunu düşünüyorum.
Suneel Kumar

Benim durumumda - e-posta SPAM klasörüme gidecekti, bu yüzden ..... hata ayıklama konusunda saatlerini
harcamadan

Elektrik kesintileri
Josef Klimuk

Yanıtlar:


501

Farklı çevre

Cron, işinize en az sayıda ortam değişkeni kümesi iletir. Farkı görmek için, bunun gibi kukla bir iş ekleyin:

* * * * * env> /tmp/env.output

Bekleyin /tmp/env.output, oluşturulacak işi yeniden kaldırın. Şimdi normal terminalinizdeki çalışma /tmp/env.outputçıktısının içeriğini karşılaştırın env.

Burada ortak bir "gotcha", PATHortam değişkeninin farklı olmasıdır. Belki cron komut komutu kullanan somecommandbulunan /opt/someApp/binEğer eklediğiniz PATHiçinde /etc/environment? cron PATHbu dosyadan yok sayar , bu nedenle betiğinizden runnning somecommandcron ile çalıştırıldığında başarısız olur, ancak bir terminalde çalıştırıldığında çalışır. /etc/environmentGibi değişkenlerin cron işlerine aktarılacağına dikkat etmek önemlidir, sadece cron gibi kendi belirlediği değişkenleri değil PATH.

Bunu aşmak için PATH, betiğin en üstünde kendi değişkeninizi ayarlayın . Örneğin

#!/bin/bash
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# rest of script follows

Bazıları sadece tüm komutlara mutlak yollar kullanmayı tercih eder. Buna karşı öneriyorum. Komut dosyanızı farklı bir sistemde çalıştırmak istiyorsanız, /opt/someAppv2.2/binbunun yerine o komutun içinde olduğunu düşünün . Sen yerine tüm senaryonun geçmesi gerekirdi /opt/someApp/binile /opt/someAppv2.2/binyerine senaryonun ilk satırda küçük bir düzenlemeyi yapmanın.

PATH değişkenini, tüm cron işlerine uygulanacak crontab dosyasında da ayarlayabilirsiniz. Örneğin

PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

15 1 * * * backupscript --incremental /home /root

5
Sanırım bunun için düştüm ve sonunda yeni hat ... çifte whammy.
WernerCD

6
+1 için env, bu komutu tamamen unutmuştum ve PATH'in çalıştığını düşündüm. Bu benim durumumda aslında oldukça farklıydı.
Izkata

8
pbr Eğer bu gibi dizinler başkalarına yazılabilir ise, sistem zaten tehlikeye girmiştir.
geirha

6
@pbr Bir sysadmin, istemeden kök dosya sistemini silebilir. Aptalca hatalar yapan sysadmins karşı koruyamazsınız. Tercümanın geriye dönük uyumlu olmayan daha yeni bir sürümünü kurarsanız, ne olursa olsun kırılmayı beklerim. Bunu yapmanın mantıklı bir yolu, onu farklı bir komut olarak yüklemektir. Örneğin, python sürüm 2.x var ve python 3'ü yükleyin, python yerine python3 olarak kurun. Ve / opt / someApp / bin için olduğu gibi, neden dünyada aklı başında bir akıl yürütme izni yoktu? Tüm aklı başında yönetici sistem dosyaları üzerinde aklı başında izinler / sahiplik sağlayacaktır.
geirha

2
@pbr Bu sonsuza kadar devam edebiliriz, evet. Yine de PATH kullanmanın neden kötü bir fikir olduğunu göremiyorum. Tartışmaya daha uygun bir ortamda bunu daha fazla tartışmak istersen, beni #ubuntu ve #bash'da, diğer kanalların arasında, irc.freenode.net
geirha'da

336

Başa dön gotcha: crontabDosyanın sonuna yeni bir satır eklemeyi unutursanız . Başka bir deyişle, crontab dosyası boş bir satırla bitmelidir.

Aşağıda bu sayfadaki man sayfalarında ilgili bölüm bulunmaktadır ( man crontabdaha sonra sonuna atlayın):

   Although cron requires that each entry in a crontab end  in  a  newline
   character,  neither the crontab command nor the cron daemon will detect
   this error. Instead, the crontab will appear to load normally. However,
   the  command  will  never  run.  The best choice is to ensure that your
   crontab has a blank line at the end.

   4th Berkeley Distribution      29 December 1993               CRONTAB(1)

91
bu böyle bir gösteri durdurucudur, neden bu kadar uzun bir süredir cron ile sabitlenmedi?
Capi Etheriel

2
Vixie cron'unda sabit gözüküyor: man crontabUbuntu 10.10'da "cron, crontab'daki her bir girişin bir yeni satır karakteri ile bitmesini gerektirir. ve yüklemeyi reddet. " (Ve sonundaki tarih 19 Nisan 2010'dur.)
Marius Gedminas

19
@ barraponto Bu aslında yeni metin editörlerinde bir hatadır. "Newline" karakterinin bir satır sonlandırma karakteri olması gerekiyor , bu nedenle bir metin dosyasındaki son satırın editörde gösterilmeyen yeni bir satır karakteriyle bitmesi gerekiyor. Vi ve vim karakteri doğru kullanıyorlar ve yeni editörler tuhaf davranışlarına başlamadan önce cron oluşturuldu ... Bu yüzden onu oynuyor ve boş bir satır ekleyerek oynuyor.
Izkata

6
Crontab'ı kullanarak düzenlerseniz crontab -e, kaydetmeye izin vermeden önce, newline için bir kontrol de dahil olmak üzere dosyanın sözdizimini kontrol eder.
Tom Harrison Jr

2
@ Chan-HoSuh, man sayfasına göre "cron, bir crontab'daki her girişin bir yeni satır karakteri ile bitmesini gerektirir. Bir crontab'daki son girişin yeni satırı yoksa, cron crontab'ı (en azından kısmen) kırılmış ve reddedecektir. yükle." Bu davranış, düzenleme yapılırken crontab'ın kaydedilmesi sırasında çağrılır -eve editörden bağımsızdır.
Tom Harrison Jr

139

Cron arka plan programı çalışmıyor. Birkaç ay önce bunu gerçekten mahvettim.

Tür:

pgrep cron 

Numara göremiyorsanız, cron çalışmıyor demektir. sudo /etc/init.d/cron startcron başlatmak için kullanılabilir.

EDIT: / bett / etc ile init betiklerini çağırmak yerine, servis programını kullanın, örneğin

sudo service cron start

EDIT: Ayrıca modern Linux'ta systemctl kullanabilirsiniz.

sudo systemctl start cron

47
Bana pgrep'i gösterdiğin için teşekkürler. Ps -ef yapmaya devam ettim | grep foo
ripper234

4
Ayrıca pidof cron, crontab gibi, 'cron' kelimesini içeren diğer uygulamalar için sonuçları çıkartabilecekleri de kullanabilirsiniz .
Pithikos

Garip, hepsi bana cronun çalıştığını gösterecek hiçbir şey vermedi, ama sudo service cron startstart: Job is already running: cron
Colleen

1
service crond startcentos / RHEL ise
Karanth

91

Senaryo içinde filenames cron.d/, cron.daily/, cron.hourly/vb nokta (içermemelidir .aksi çalışma parçaları onları atlar).

Koşu parçalarına bakınız (8):

   If neither the --lsbsysinit option nor the --regex option is given then
   the names must consist entirely of upper and lower case  letters,  dig‐
   its, underscores, and hyphens.

   If  the  --lsbsysinit  option  is given, then the names must not end in
   .dpkg-old  or .dpkg-dist or .dpkg-new or .dpkg-tmp, and must belong  to
   one  or more of the following namespaces: the LANANA-assigned namespace
   (^[a-z0-9]+$);   the   LSB   hierarchical   and   reserved   namespaces
   (^_?([a-z0-9_.]+-)+[a-z0-9]+$);  and  the  Debian cron script namespace
   (^[a-zA-Z0-9_-]+$).

Eğer bir cron komut dosyası var ise, backup.sh, analyze-logs.pliçinde cron.daily/dizinde, uzantı adlarını kaldırmak için en iyi olur.


10
Hata değil bir özellik - myscript.backup veya myscript.original veya myscript.rpm-new gibi öğelerin myscript'in hemen yanında çalışmasını önler.
pbr

@pbr: mantıklı. En azından ayıklama eğer için yararlı olurdu run-parts --test(veya benzeri başka hayali seçeneği --debugçıkış alacaktı o nedenle de dahil olmak üzere atlar dosyaları.
Rabarberski

8
Eğer bu bir özellik ise, hoş bir şey değil :( Birçok kişi dosya adında nokta kullanır (backup.sh en yaygın olanıdır). Bir komut dosyasını çalıştırmayı durdurmak için kullanmak "cron.d" dizininden kaldırın
MatuDuke

7
Bu etkili bir hata olduğu kadar kötü bir özelliktir. İnsanlar yalnızca işlerin amaçlandığı zaman çalıştırıldığından emin olmak istiyorlarsa, belirli bir sonlandırma (".list" veya ".cron" veya benzeri bir şey gibi) gerektirmesi yaygın bir uygulamadır. İsteğe bağlı olarak ".bak" veya ".temp" ya da her neyse olası bir ayırıcı olarak nokta seçmek, insanları öngörüldüğü gibi karıştırması dışında tamamen tahmin edilemez. ".Sh" ve ".pl" gibi meşru sonlar on yıllardır yaygın olarak kullanılmaktadır. Ancak pek çok insan nokta yerine "_bak" veya "_temp" veya "-bak" kullanır. Bu korkunç bir tasarım seçimidir; en iyi ihtimalle bir tasarım hatası.
Teekin

68

Birçok ortamda cron komutları çalıştırır sh, birçok kişi kullanacağını varsayar bash.

Başarısız bir komut için bunu test etmek veya düzeltmek için öneriler:

  • İşe yarayıp shyaramadığını görmek için komutu çalıştırmayı deneyin :

    sh -c "mycommand"
    
  • Bash'da çalıştırıldığından emin olmak için komutu bir bash alt kabuğuna sarın:

    bash -c "mybashcommand"
    
  • Cron'a, crontab'ınızın en üstündeki kabuğu ayarlayarak tüm komutları bash'de çalıştırmasını söyleyin:

    SHELL=/bin/bash
    
  • Komut bir komut dosyasıysa, komut dosyasının bir shebang içerdiğinden emin olun:

    #!/bin/bash
    

bash öneri benim cron ile çok yardımcı, sabit bir konudur.
Maxim Galushka

Bu sadece 1 hileci / sorun giderme beni neden oldu. Sorunun farkında değilseniz daha da şaşırtıcı olan, tipik bir kabuk iseniz bash, ancak birlikte olmadığınızda , komut dosyasının el ile çalışabilmesidir cron. Teşekkürler!
Hendy

Uzun zaman önce, ilgili bir şeye rastladım: Komut sourcebash ama sh değil. Cron / sh konumunda bir süre kullanın: . envfileyerine source envfile.
kungphu

@Clockwork sh "mycommand", shkomutumu komut dosyası olarak çalıştırmamı söyler . Bunu mu demek istediniz sh -c "mycommand"? Her neyse, bu cevap, komutu özellikle bash'te çalıştırma ile ilgili görünüyor, peki neden komutu shburaya eklediniz ?
Olorin

@Olorin Anladığım kadarıyla, ilk noktanın amacı sh ile denemek ve çalıştırmak, sorunun gerçekten cronun bash yerine sh ile çalıştırdığı gerçeğinden gelip gelmediğini anlamaktı. Sonra tekrar, konuyla ilgili az bilgim var, bu yüzden yanlış olabilirim.
Clockwork

40

Saat dilimleriyle ilgili bazı problemlerim vardı. Cron, yeni kurulum zaman dilimi ile çalışıyordu. Çözüm, cron'u yeniden başlatmaktı:

sudo service cron restart

6
Evet, sistemdeki saat dilimini değiştirdikten sonra, saatin kaç olduğunu önemseyen her hizmeti yeniden başlatmanız veya yeniden başlatmanız gerekir. Her şeyi yakaladığımdan emin olmak için yeniden başlatmayı tercih ederim.
pbr

Tanrı aşkına, bunun için saatlerce öldürüldü. * * * * * touch /tmp/cronworksHiçbir zaman bir şey yapmadı, ancak servisin yeniden başlatılması RELOADdenedi , ancak cronlog'da.
НЛО

36

Komut dosyaları için mutlak yol kullanılmalıdır:

Örneğin, /bin/grepyerine kullanılmalıdır grep:

# m h  dom mon dow   command
0 0 *  *  *  /bin/grep ERROR /home/adam/run.log &> /tmp/errors

Onun yerine:

# m h  dom mon dow   command
0 0 *  *  *  grep ERROR /home/adam/run.log &> /tmp/errors

Bu özellikle zor, çünkü aynı komut kabuktan çalıştırıldığında çalışacak. Bunun nedeni, kullanıcı ile cronaynı PATHortam değişkenine sahip olmamasıdır .


3
geirha cevabını görün, cron's PATH
Capi Etheriel

9
Bzzt. PATH tanımlamanıza gerek yok - mutlak yolları kullanarak buradaki en iyi uygulamadır. "yürütülebilir bir başka bilgisayarda başka bir yerde olabilir" deme "tam olarak bu programı çalıştırmasını istiyorum ve başka birisinin orijinal programımın önünde yola koymasını istemiyorum"
pbr

1
evet bu benim /usr/bin/whatever
içindi, cronun

32

Eğer crontab komutunuzda bir %sembol varsa, cron yorumlamaya çalışır. Bu nedenle, içinde herhangi bir komut kullanıyorsanız %(tarih komutuna format formatı gibi) atmanız gerekir.

Bu ve diğer iyi şeyler burada:
http://www.pantz.org/software/cron/croninfo.html


Bu benim Cron işimin geçen hafta başarısız olmasına sebep olan şeydi. Sonunda Date'imin bir kaçış karakterinin olmadığını anladım (kaçış karakterinin ne olduğunu arayan diğer tüm insanlar için ters eğik çizgi). Yuppi!
Valien


25

Cron çalıştırılabilir olmayan bir betiği çağırıyor.

Çalıştırarak chmod +x /path/to/scripkomut çalıştırılabilir hale gelir ve bu sorunun çözülmesi gerekir.


5
Bu cron, benzersiz bir /path/to/scriptkomut değildir ve komut satırından çalıştırmayı deneyerek kolayca izlenebilir .
Adam Matan

4
Komut dosyalarını . scriptnameveya sh scriptnameveya ile çalıştırmaya alışkınsanız bash scriptname, bu cronbelirli bir sorun haline gelir .
Eliah Kagan

24

Kullanıcı şifresinin süresi dolmuş da olabilir. Kökün bile şifresi sona erebilir. Yapabilirsiniz tail -f /var/log/cron.logve parolanın süresi ile cron başarısız göreceksiniz. Bu işlemi yaparak parolanın süresinin dolmamasını sağlayabilirsiniz:passwd -x -1 <username>

Bazı sistemlerde (Debian, Ubuntu) cron günlüğü varsayılan olarak etkin değildir. Gelen /etc/rsyslog.conf veya /etc/rsyslog.d/50-default.conf hat:

# cron.*                          /var/log/cron.log

düzenlenmemiş ( sudo nano /etc/rsyslog.conf) olmalı :

cron.*                          /var/log/cron.log

Bundan sonra, rsyslog üzerinden yeniden başlatmanız gerekir.

/etc/init.d/rsyslog restart

veya

service rsyslog restart 

Kaynak: Debian Linux'ta crontab günlüğünü etkinleştir

Bazı sistemlerde (Ubuntu) cron için ayrı bir günlük dosyası varsayılan olarak etkin değildir, ancak cron ile ilgili günlükler syslog dosyasında görünmektedir. Biri kullanabilir

cat /var/log/syslog | grep cron -i

cron ile ilgili mesajları görüntülemek için.


Debian var (wheezy) ama /etc/init.d/rsyslog yok, sadece inetutils-syslogd ve sysklogd yok. Bir şey mi kurmak zorundayım yoksa ikisinden birini yeniden başlatmalı mıyım?
hgoebl 21:16

18

Eğer cronjob'ınız GUI uygulamalarını çağırıyorsa, onlara hangi EKRAN'ı kullanmaları gerektiğini söylemeniz gerekir.

Örnek: Firefox'un cron ile başlatılması.

Komut dosyanız bir export DISPLAY=:0yerde olmalı .


aplay bunun bir nedenden dolayı buna ihtiyacı vardı. teşekkür ederim
IljaBek

* * * * * export DISPLAY=:0 && <command>
LoMaPh

15

İzin problemleri oldukça yaygın, korkarım.

Ortak bir geçici çözümün, kökünün crontab komutunu kullanarak her şeyi yürütmek olduğunu, bazen Gerçekten Kötü Bir Fikir olduğunu unutmayın. Uygun izinlerin ayarlanması kesinlikle büyük ölçüde göz ardı edilen bir konudur.


Boru çıktısına henüz ayarlanmamış bir dosyaya boru çıkışına ayarlanmış bir crontab hattınız varsa ve dosyanın dizini cron kullanıcısının erişemediği bir dosya ise, satırın çalışmayacağını unutmayın.
Evan Donovan

14

Güvensiz cron tablosu izni

İzni güvensiz ise bir cron tablosu reddedilir

sudo service cron restart
grep -i cron /var/log/syslog|tail -2
2013-02-05T03:47:49.283841+01:00 ubuntu cron[49906]: (user) INSECURE MODE (mode 0600 expected) (crontabs/user)

Sorun çözüldü

# correct permission
sudo chmod 600 /var/spool/cron/crontabs/user
# signal crond to reload the file
sudo touch /var/spool/cron/crontabs

Önce kendim anladım, sonra da cevabını buldum! Yine de çok teşekkürler! Benim durumumda / var / spool / cron / crontabs içindeki bazı crontab'ları SVN aracılığıyla geri aldım / restore ettim, bu durum onun izinlerini değiştirdi!
alfonx

12

Komut dosyası konum duyarlıdır. Bu, her zaman bir komut dosyasında mutlak yollar kullanmakla ilgilidir, ancak tamamen aynı değildir. Çalıştırmadan cdönce cron işinizin belirli bir dizine gitmesi gerekebilir , örneğin Rails uygulamasındaki bir komisyon görevinin, uygun veritabanı yapılandırmasından bahsetmek yerine, doğru görevi bulmak için Rake için uygulama kökünde olması gerekebilir.

Yani bir crontab girişi

23 3 * * * /usr/bin/rake db:session_purge RAILS_ENV=production

daha iyi olurdu

23 3 * * * cd / var / www / üretim / geçerli ve& / usr / bin / komisyon db: session_purge RAILS_ENV = üretim

Veya crontab girişini daha basit ve daha az kırılgan tutmak için:

23 3 * * * /home/<user>/scripts/session-purge.sh

aşağıdaki kod ile /home/<user>/scripts/session-purge.sh:

cd / var / www / üretim / akım
/ usr / bin / rake db: session_purge RAILS_ENV = üretim

1
Eğer cron'dan çağrılan script PHP gibi yorumlanmış bir dilde yazılmışsa, çalışma dizinini betiğin içinde ayarlamanız gerekebilir. Örneğin, PHP’de: chdir(dirname(__FILE__));
Evan Donovan

Sadece bunu yakaladım: senaryo eski dizimin kök dizinindeydi, ama sonra onu taşıdım (ve crontab'ı güncelledim) ve neden işe yaramadığını anlayamadım. Komut dosyasının göreceli bir yol kullandığı, betiğin konumuna göre olduğunu varsayarsak, aslında ev dizininin köküyle göreli olduğu varsayılır, çünkü bu, cron'un kullandığı çalışma dizinidir, bu yüzden komut dosyası (komut dosyasının beklenen çalışma dizini ve fiili sadece çalışan çünkü o benim ev dizininin kök iken çalışmış oldu denk).
Micheal Johnson,

11

Geçmişte çalışan Crontab özellikleri , bir crontab dosyasından diğerine taşındığında bozulabilir. Bazen nedeni, spikeri bir sistem crontab dosyasından bir kullanıcı crontab dosyasına veya tam tersine taşımanızdır.

Cron iş özellikleri biçimi, kullanıcıların crontab dosyaları (/ var / spool / cron / kullanıcı adı veya / var / spool / cron / crontabs / kullanıcı adı) ve sistem crontabları ( /etc/crontabve içindeki dosyalar /etc/cron.d) arasında farklılık gösterir .

Sistem crontab'larının çalıştırma komutundan hemen önce fazladan bir 'kullanıcı' alanı vardır.

Bu, george; command not foundbir komutu /etc/crontabbir dosyadan çıkardığınızda veya bir dosyayı /etc/cron.dkullanıcının crontab dosyasına dönüştürdüğünüzde ortaya çıkan hataları belirtir .

Tersine, cron /usr/bin/restartxyz is not a valid username, tersi meydana geldiğinde benzer veya benzeri hatalar verir.


10

cron betiği --verbose seçeneğiyle bir komut çağırıyor

Bana bir cron betiği başarısız oldu çünkü betiği yazarken otomatik pilottaydım ve --verbose seçeneğini kullandım:

#!/bin/bash
some commands
tar cvfz /my/archive/file.tar.gz /my/shared/directory
come more commands

Betik kabuktan yürütülürken gayet iyi çalıştı, ancak verbose çıktısı kabuktan çalıştırıldığında stdout'a gittiğinden crontab'dan çalıştırırken başarısız oldu, ancak hiçbir yerde crontab'dan çalıştırılmadığı zaman. 'V' kaldırmak için kolay düzeltme:

#!/bin/bash
some commands
tar cfz /my/archive/file.tar.gz /my/shared/directory
some more commands

5
Bu neden başarısızlığa neden oluyor? Tampon sorunları?
Adam Matan

Cron işleri aracılığıyla trriggred Herhangi çıkışlar veya hatalar biz output.We herhangi bir dosyaya veya / dev / null 'yönlendirebilirsiniz / Bu hatalarla ilgili bakım asla unutmamalıyız sizin mailbox.So gönderilen için gooing edilir
Nischay

10

Cron'u gördüğüm en sık neden yanlış belirtilen bir programda başarısız. Sanki 11:15 planlanan bir işi belirtmek için pratik ister 15 23 * * *yerine * * 11 15 *ya 11 15 * * *. Haftanın günü, gece yarısından sonraki işler için de karıştı. MF 2-6gece yarısından sonra değil 1-5. Belirli tarihler genellikle bir problemdir, çünkü nadiren kullanırız * * 3 1 *3 Mart değildir. Emin değilseniz, cron programlarınızı çevrimiçi olarak https://crontab.guru/ adresinden kontrol edin .

Farklı platformlarda çalışmanız durumunda 2/3zaman şartnameleri gibi desteklenmeyen seçenekler kullanılıyorsa arızalara da neden olabilirsiniz. Bu çok kullanışlı bir seçenektir, ancak evrensel olarak mevcut değildir. Ayrıca, 1-5ya da gibi listelerle ilgili sorunlara rastladım 1,3,5.

Niteliksiz yolları kullanmak da sorunlara neden oldu. Varsayılan yol genellikle genellikle /bin:/usr/binstandart komutlar çalışacak şekildedir. Bu dizinler genellikle istenen komuta sahip değildir. Bu, standart olmayan komutları kullanarak komut dosyalarını da etkiler. Diğer çevre değişkenleri de eksik olabilir.

Mevcut bir crontab'ı tamamen engellemek bana sorun çıkardı. Şimdi bir dosya kopyasından yüklüyorum. Bu, mevcut crontab'dan gizlenmişse kurtarılabilir crontab -l. Crontab kopyasını ~ / bin olarak saklıyorum. Baştan sona yorumlanır ve çizgi ile biter # EOF. Bu, aşağıdaki gibi bir crontab girişinden günlük olarak yeniden yüklenir:

#! / Usr / bin / crontab
# Bu crontab'ı yeniden yükle
#
54 12 * * * $ {HOME} / bin / crontab

Yukarıdaki yeniden yükleme komutu, crontab'ı çalıştıran bir patlama yolu olan yürütülebilir bir crontab'a dayanır. Bazı sistemler komutta crontab'ın çalışmasını ve dosyayı belirtmesini gerektirir. Dizin ağ paylaşımlıysa, genellikle crontab.$(hostname)dosyanın adı olarak kullanırım . Bu sonuçta yanlış crontab'ın yanlış sunucuya yüklendiği durumları düzeltir.

Dosyayı kullanmak, crontab'ın ne olması gerektiğinin bir yedeğini sağlar ve geçici düzenlemelerin (kullandığım tek zaman crontab -e) otomatik olarak yedeklenmesini sağlar. Çizelgeleme parametrelerini doğru almanıza yardımcı olan başlıklar vardır. Deneyimsiz kullanıcılar bir crontab düzenlerken, bunları ekledim.

Nadiren kullanıcı girişi gerektiren komutlarla karşılaştım. Bunlar crontab altında başarısız olur, ancak bazıları giriş yönlendirmesiyle çalışacaktır.


3
Bu üç ayrı sorunu kapsar. Ayrı cevaplara bölünebilir mi?
Eliah Kagan

9
30 23 * * * 11: 15'e nasıl dönüştüğünü açıklayabilir misiniz ?
JYelton

@JYelton Açıkçası yanlıştı, öyle olmalı 15 23 * * *. Şimdi düzeltildi.
Melebius

7

Bir hesaba SSH tuşları ile erişiyorsanız, hesapta oturum açmak mümkündür, ancak hesaptaki şifrenin kilitli olduğuna dikkat etmeyin (örn; süresi dolmuş veya geçersiz şifre denemeleri nedeniyle)

Sistem PAM kullanıyorsa ve hesap kilitliyse, bu cronjob'ın çalışmasını durdurabilir. (Bunu Solaris'te test ettim, ancak Ubuntu'da test etmedim)

Bunun gibi mesajları / var / adm / messages'de bulabilirsiniz:

24 Eki 07:51:00 mybox cron [29024]: [ID 731128 auth.notice] pam_unix_account: cron, kilitli hesap myuser'ı yerel ana bilgisayardan doğrulamaya çalışıyor
24 Eki 07:52:00 mybox cron [29063]: [ID 731128 auth.notice] pam_unix_account: cron, kilitli hesap myuser'ı yerel ana bilgisayardan doğrulamaya çalışıyor
24 Eki 07:53:00 mybox cron [29098]: [ID 731128 auth.notice] pam_unix_account: cron, kilitli hesap myuser'ı yerel ana bilgisayardan doğrulamaya çalışıyor
24 Ekim 07:54:00 mybox cron [29527]: [ID 731128 auth.notice] pam_unix_account: cron, kilitli hesap myuser'ı yerel ana bilgisayardan doğrulamaya çalışıyor

Tek yapmanız gereken koşmak:

# passwd -u <KULLANICI ADI>

Hesabın kilidini açmak için root olarak ve crontab'ın tekrar çalışması gerekir.


7

Eğer böyle bir komutunuz varsa:

* * * * * /path/to/script >> /tmp/output

ve çalışmıyor ve herhangi bir çıktı göremiyorsunuz, mutlaka cronun çalışmadığı anlamına gelmeyebilir. Komut dosyası bozulabilir ve çıktılar / tmp / çıktıya geçmeyen stderr öğesine gider. Bu çıktıyı da yakalayarak durumun böyle olmadığını kontrol edin:

* * * * * /path/to/script >> /tmp/output 2>&1

Bunun sorununuzu çözmenize yardımcı olup olmadığını görmek için.


3

=== Docker uyarısı ===

Liman işçisi kullanıyorsanız,

Arka planda çalışacak cron yapmayı başaramadığımı eklemenin uygun olduğunu düşünüyorum.

Kabın içinde bir cron işi yürütmek için amir kullandım ve cron -fdiğer süreçle birlikte koştum .

Düzenleme: Başka bir sorun - Kapsayıcıyı HOST ağları ile çalıştırırken çalışmasını da sağlayamadım. Bu konuya ayrıca bakınız: https://github.com/phusion/baseimage-docker/issues/144



3

Eski işlem verilerini bir veritabanından temizlemek için başka bir komut dosyası oluşturan bir yükleme kabuğu betiği yazıyordum. Görevin bir parçası olarak günlük cronişi, veritabanı yükünün düşük olduğu zamanlarda, keyfi bir zamanda çalışacak şekilde yapılandırması gerekiyordu .

mycronjobCron programı, kullanıcı adı ve komut ile bir dosya oluşturdum ve /etc/cron.ddizine kopyaladım . İki yakaladım:

  1. mycronjob Dosya çalıştırmak için kök tarafından sahiplenilmesi gerekiyordu
  2. Dosyanın izinlerini 644 - 664 olarak çalışmak zorunda kalmayacak şekilde ayarlamak zorunda kaldım.

Bir izin sorunu /var/log/syslogşuna benzer bir şey olarak ortaya çıkacaktır :

Apr 24 18:30:01 ip-11-22-33-44 cron[40980]: (*system*) INSECURE MODE (group/other writable) (/etc/crontab)
Apr 24 18:30:01 ip-11-22-33-44 cron[40980]: (*system*) INSECURE MODE (group/other writable) (/etc/cron.d/user)

İlk satır /etc/crontabdosyaya ve daha sonra altına yerleştirdiğim dosyaya atıfta bulunur /etc/cront.d.


2

Crontab'ın bir şekilde yazdığı satır anlamıyor. Doğru yazılması gerekiyor. İşte CrontabHowTo .


1
Bu nasıl hata ayıklanabilir?
Adam Matan

Cron hata günlüğünü gözden geçirmek en yaygın yoldur. IIRC 'crontab -e', dosyayı da düzenledikten sonra bir sözdizimi ayrıştırır - ancak bu evrensel olmayabilir.
pbr

2

Cron arka plan programı çalışıyor olabilir ama aslında çalışmıyor. Cron'u yeniden başlatmayı deneyin:

sudo /etc/init.d/cron restart

3
Bu davayı ASLA üretimde görmedim. Olmadığı anlamına gelmez - sadece 30 yıldır UNIX ve Linux kullanıyorum. Cron delicesine sağlamdır.
pbr

1
Emin değilim ama bunun gerçekten başıma geldiğini düşünüyorum. pidofCron'u denedim ve hiçbir şey almadım. Programı kullanarak denedim serviceve cron zaten çalışıyordu dedi. Sadece bu komutu koştum pidofve tekrar koştum ve bir sonuç alıyorum.
Colleen,

2

Cron'a "crontab -e" ile bir satırdaki kullanıcı adı argümanıyla yazılır. Kullanıcıların (veya sistem yöneticilerinin) kabuk komut dosyalarını yazarken ve neden otomatikleşemediklerini anlamadıklarını gördüm. "User" argümanı / etc / crontab içinde var, fakat kullanıcı tanımlı dosyalar değil. bu nedenle, örneğin kişisel dosyanız şöyle bir şey olurdu:

# m h dom mon dow command

* * */2  *   *  /some/shell/script

Oysa / etc / crontab şöyle olacaktır:

# m h dom mon dow user   command

* * */2  *   *  jdoe   /some/shell/script

Peki neden ikincisini yapasın? Eh, izinlerinizi nasıl ayarlamak istediğinize bağlı olarak bu çok sarsılabilir. Karmaşıklıkları anlamayan veya angarya ile uğraşmak istemeyen kullanıcıların görevlerini otomatikleştirmek için komut dosyaları yazdım. İzinleri ayarlayarak --x------, komut dosyasını okuyabilmeleri için çalıştırılabilir hale getirebilirim (ve belki de yanlışlıkla değiştirebilirim). Bununla birlikte, bu komutu bir dosyadan başkaları ile birlikte çalıştırmak isteyebilirim (böylece bakımı kolaylaştırır) ancak dosya çıktısının doğru sahibine atandığından emin olun. (En azından Ubuntu 10.10 olarak) Bunu yapmak, dosyayı okumak yanı sıra yürütmek için yetersizlik, artı (geçerken tuhaf ki, hiçbir hataya neden olan / etc / crontab dönemleri koyarak ile yukarıda bahsedilen konuyla hem sonları crontab -e) .

Örnek olarak, sudo crontab -eroot betiğine karşılık gelen bir betiği root betiğinde çalıştırmak için kullanılan örnekleri gördüm chown username file_output. Özensiz, ama işe yarıyor. IMHO, Daha zarif seçenek /etc/crontabkullanıcı adı beyanı ve uygun izinlerle file_outputkoymak, doğru yere ve sahibine gidiyor.


"Bunu yapmak (en azından Ubuntu 10.10'da) hem dosyayı okuma hem de yürütme yetersizliğini bozuyor…" Açıklığa kavuşturmalıyım: / etc / crontab (varsayılan olarak) okuma ve yürütme izinleri gerektirir, oysa COULD "w" iznine olan ihtiyacı ve ".sh" gibi uzantıları olan sorunu geçersiz kılan bir cronjob oluşturmak için "sudo crontab -e" komutunu çalıştırın. Cron kodunu ayırmak ve neden çalıştığını kontrol etmek için zamanım olmadı, farkettim.
Mange,

2

Aaron Peart'ın ayrıntılı mod hakkında bahsettiği şeyi oluşturmak, bazen ayrıntılı modda olmayan komut dosyaları başlatacak ancak dahil edilen bir komutun varsayılan davranışı, işlem başladıktan sonra ekrana bir satır veya daha fazla çıktı verecekse bitmeyecektir. Örneğin, intranetimiz için, uzak sunuculara dosya yükleyen veya yükleyen bir yardımcı program olan curl'ı kullanan ve yalnızca söz konusu uzak dosyalara yalnızca HTTP üzerinden erişebiliyorsanız kullanışlıdır. 'Curl http://something.com/somefile.xls ' ifadesini kullanmak , yazdığım bir senaryoya neden oldu ve hiçbir zaman tamamlamadı, çünkü bir ilerleme çizgisinin ardından yeni bir satır attı. Sessiz bayrağını (-s) kullanarak herhangi bir bilgi çıktısını almamasını ve dosyanın indirilmemesi durumunda işlemek için kendi kodumu yazmam gerekti.


1
Sessiz moda sahip olmayan programlar için çıkışlarını yönlendirebilirsiniz /dev/null. Örneğin: some-command > /dev/nullBu yalnızca standart çıktıyı yönlendirir ve hata çıktısını yönlendirmez (hatalardan haberdar olmak istediğinizden genellikle istediğinizdir). Hata çıkışını da yönlendirmek için kullanın some-command &> /dev/null.
Eliah Kagan

Evet, sözde senaryoyu yazarken ilk düşüncem buydu. Neden kullanmadığımı, belki de çözümü çözen bazı standart dışı davranışları kullanmadığımı unuttum. Ayrıntılı / etkileşimli modun bazı komutlarda varsayılan olduğunu biliyorum (sana bakıyorum, scp!).
Mange

2

Çevresel değişkenleri crontable'da tanımlayabilseniz de, bir kabuk betiğinde değilsiniz. Yani aşağıdaki gibi yapılar işe yaramaz:

SOME_DIR=/var/log
MY_LOG_FILE=${SOME_LOG}/some_file.log

BIN_DIR=/usr/local/bin
MY_EXE=${BIN_DIR}/some_executable_file

0 10 * * * ${MY_EXE} some_param >> ${MY_LOG_FILE}

Bunun nedeni değişkenlerin crontable'da yorumlanmamasıdır: tüm değerler litre olarak alınır. Ve parantezleri atlarsanız bu aynıdır. Yani komutlarınız çalışmaz ve günlük dosyalarınız yazılmaz ...

Bunun yerine tüm ortam değişkenlerinizi doğrudan tanımlamanız gerekir:

SOME_DIR=/var/log
MY_LOG_FILE=/var/log/some_file.log

BIN_DIR=/usr/local/bin
MY_EXE=/usr/local/bin/some_executable_file

0 10 * * * ${MY_EXE} some_param >> ${MY_LOG_FILE}

2

Bir görev cron içinde çalıştırıldığında stdin kapanır. Stdin'in bulunup bulunmadığına bağlı olarak farklı davranan programlar, kabuk oturumu ile cron arasında farklı davranacaktır.

Bunun bir örneği, goaccessweb sunucusu günlük dosyalarını analiz etmek için kullanılan programdır . Bu cron içinde çalışmaz:

goaccess -a -f /var/log/nginx/access.log > output.html

ve goaccessrapor oluşturmak yerine yardım sayfasını gösterir. Kabukta bu ile çoğaltılabilir

goaccess -a -f /var/log/nginx/access.log > output.html < /dev/null

Bunun için düzeltme goaccess, dosyadan okumak yerine logu stdin'den okumasını sağlamaktır; bu nedenle çözüm crontab girişini değiştirmektir.

cat /var/log/nginx/access.log | goaccess -a > output.html

2

Benim durumumda cron ve crontab'ın farklı sahipleri vardı.

ÇALIŞTIRMAM Ben bu vardı:

User@Uva ~ $ ps -ef | grep cron | grep -v grep
User    2940    7284 pty1     19:58:41 /usr/bin/crontab
SYSTEM   11292     636 ?        22:14:15 /usr/sbin/cro 

Temelde cron-config çalıştırmalı ve soruları doğru cevaplamalıydım. 'Kullanıcı' hesabım için Win7 kullanıcı şifremi girmem gereken bir nokta var. Yaptığım okumadan, bu potansiyel bir güvenlik sorunu gibi görünüyor, ancak tek bir ev ağındaki tek yöneticiyim, bu yüzden tamam olduğuna karar verdim.

İşte beni yönlendiren komut dizisi:

User@Uva ~ $ cron-config
The cron daemon can run as a service or as a job. The latter is not recommended.
Cron is already installed as a service under account LocalSystem.
Do you want to remove or reinstall it? (yes/no) yes
OK. The cron service was removed.

Do you want to install the cron daemon as a service? (yes/no) yes
Enter the value of CYGWIN for the daemon: [ ] ntsec

You must decide under what account the cron daemon will run.
If you are the only user on this machine, the daemon can run as yourself.
   This gives access to all network drives but only allows you as user.
To run multiple users, cron must change user context without knowing
  the passwords. There are three methods to do that, as explained in
  http://cygwin.com/cygwin-ug-net/ntsec.html#ntsec-nopasswd1
If all the cron users have executed "passwd -R" (see man passwd),
  which provides access to network drives, or if you are using the
  cyglsa package, then cron should run under the local system account.
Otherwise you need to have or to create a privileged account.
  This script will help you do so.
Do you want the cron daemon to run as yourself? (yes/no) no

Were the passwords of all cron users saved with "passwd -R", or
are you using the cyglsa package ? (yes/no) no

Finding or creating a privileged user.
The following accounts were found: 'cyg_server' .
This script plans to use account cyg_server.
Do you want to use another privileged account name? (yes/no) yes
Enter the other name: User

Reenter: User


Account User already exists. Checking its privileges.
INFO: User is a valid privileged account.
INFO: The cygwin user name for account User is User.

Please enter the password for user 'User':
Reenter:
Running cron_diagnose ...
... no problem found.

Do you want to start the cron daemon as a service now? (yes/no) yes
OK. The cron daemon is now running.

In case of problem, examine the log file for cron,
/var/log/cron.log, and the Windows event log (using /usr/bin/cronevents)
for information about the problem cron is having.

Examine also any cron.log file in the HOME directory
(or the file specified in MAILTO) and cron related files in /tmp.

If you cannot fix the problem, then report it to cygwin@cygwin.com.
Please run the script /usr/bin/cronbug and ATTACH its output
(the file cronbug.txt) to your e-mail.

WARNING: PATH may be set differently under cron than in interactive shells.
         Names such as "find" and "date" may refer to Windows programs.


User@Uva ~ $ ps -ef | grep cron | grep -v grep
    User    2944   11780 ?        03:31:10 /usr/sbin/cron
    User    2940    7284 pty1     19:58:41 /usr/bin/crontab

User@Uva ~ $

1
İyi bir şekilde belgelenmesine rağmen, bu Cygwin'e özgü bir noktaya benziyor; gerçekten askubuntu'ya ait mi?
sxc731

2

RHEL7 sunucularımda kök cron işleri çalışacak, ancak kullanıcı işleri çalışmayacaktır. Bir ev dizini olmadan işlerin çalışmayacağını buldum (ancak / var / log / cron'da iyi hatalar göreceksiniz). Giriş dizinini oluşturduğumda sorun çözüldü.


2

Crontab dosyanızı bir windows editörü (samba veya başka bir şey kullanarak) kullanarak düzenlediyseniz ve yeni satırları \ n \ r veya sadece \ r ile değiştirdiyseniz, cron çalışmaz.

Ayrıca, /etc/cron.d/* kullanıyorsanız ve bu dosyalardan birinin içinde varsa, cron dosyalar arasında hareket edecek ve kötü bir dosyaya ulaştığında duracaktır. Sorunun bu olup olmadığından emin değil misin?

kullanın:

od -c /etc/cron.d/* | grep \r
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.