Neden crontab'ım tetiklemedi?


29

Kullandığım crontab -ebenim crontab aşağıdaki satırı eklemek için:

* * * * * echo hi >> /home/myusername/test

Yine de, test dosyasının yazıldığı yeri görmüyorum. Bu bir izin sorunu mu yoksa crontab düzgün çalışmıyor mu?

Cron sürecinin çalıştığını görüyorum. Bunu nasıl hata ayıklayabilirim?

Düzenleme - Ask Ubuntu'nun crontab hakkında güzel bir sorusu var , ne yazık ki bu bana yardımcı olmuyor.

Düzenleme 2 - Hmm, sanırım test dosyam 214 satırdan oluşuyor, bu da son 214 dakika boyunca her dakika yazıldığı anlamına geliyor. Sorunun ne olduğundan emin değilim, ama açıkça belli oldu.

Yanıtlar:


23

Her cronbiri dakikada bir güncellenen crontab dosyalarını kontrol eden ve bir sonraki dakikaya kadar yeni girişleri dikkate almayan uygulamaları (hepsi değil ve hangilerinin hazırlıksız olduğunu, ancak Linux altında bir taneyle karşılaştığım) uygulamaları var. . Bu nedenle, bir crontab'ın ilk kez ateşlenmesi iki dakika kadar sürebilir. Bu senin gözlemlediğin şey olabilir.


1
Solaris'i ya da belki Solaris'i sanırım. Bir crontab girişinden bir betiği test ederken gelecekte cron girişini 3-5 dakika çalıştırma alışkanlığım var, çünkü bu davranış her zaman kandırılıyordu.
Bruce Ediger

fcronBunu da yapar.
phunehehe

Ya "kontrol" rutini bir kaç dakikadan daha fazla tutarsa? Tetiklenmeyen bu uzun "kontrol" sırasında tetiklenmesi gereken cronjobs olacaktır.
ospider,

@ ospider Kontrol sadece bir saniyenin bir kısmını alır.
Gilles 'SO- kötülük' dur

28

Eğer bir katma mı senin cronjob sonra boş satır ?


Benim işimden sonra boş bir satır var.
ripper234

4
Boş bir satır değil, son satırın sonundaki yeni satır. Bir metin dosyasının, her biri bir satırsonu ile sonlandırılan bir satır dizisinden oluşması gerekiyor, bu nedenle boş olmayan herhangi bir metin dosyası, yeni satır karakteriyle bitiyor. Bazı yardımcı programlar bir dosyadaki son satırdan sonra hiçbir şeyi işlemez.
Gilles 'SO- kötülük'

1
Bu terimler sorusudur, "newline character" "bu karakterden sonra yeni bir metin satırına başladıktan sonra" anlamına gelir. Son satır ile EOF arasındaki 0 ​​bayt boş satır olarak da kabul edilebilir ("0 karakter içeren satır")
gelraen 17:11

10

Aynı problemi yaşadım - sonunda yeni bir giriş ekledikten sonra çalışan bir crontab aniden durdu. Son satırdan sonra yeni bir satır eklemeyi unuttuğum ortaya çıktı.

Komutu yayınlayarak öğrendim

cat /var/log/syslog | grep crontab

ve çıktı sorunu gösterdi:

Jul  2 08:16:01 shiva cron[1254]: (*system*) RELOAD (/etc/crontab)
Jul  2 08:16:01 shiva cron[1254]: (*system*) ERROR (Missing newline before EOF, this crontab file will be ignored)

Newline'ı eklemek ve kaydetmek problemi çözdü.


5

Bu gibi sesler sabittir. Bir dahaki sefere, STDERR'yi de kaydetmeyi deneyin. Aşağıdakiler yalnızca STDOUT'a giriş yapar, STDERR'e değil:

* * * * * echo hi >> /home/myusername/test

STDERR için de açık bir cümle olduğundan emin olun. Aksi takdirde, STDERR kullanıcıya e-posta ile gönderilebilir (e-postanın çalıştığını varsayarsak) veya Cron'un nasıl yapılandırıldığına bağlı olarak hiçbir yere gitmeyebilir.

* * * * * echo hi >> /home/myusername/test 2> /home/myusername/test.stderr

Benim tercihim cronjob çıktısını syslog'a göndermek. Bu yolla mevcut herhangi bir syslog altyapısından (merkezi syslogs, Splunk, log dönüşü zaten desteklenmiş, / var / log / messages & / var / log / cronjob, vb. İçindeki mesajları karşılaştırmak çok kolay) yararlanıyorum. gereksiz e-postalarla sysadmins (me) spam.

* * * * * echo hi >> /home/myusername/test 2>&1 | /usr/bin/logger -t mycronjob

2

Benimle sorun betiğin çalıştırılabilir olmamasıydı. Crontab vardı -e böyle bir kurulum

* * * * * /bin/my-script.sh

Ve myscript dosyası çalıştırılabilir değildi, bu yüzden koştum

chmod +x my-script.sh

Hemen çıktıyı beklendiği gibi görmeye başladım.


1

Ben değiştirdiğinizde cron hattı bilgisayarımda cezası çalışır myusernaeiçin phunehehe. Sisteminizde neyin yanlış olduğunu bulmanın birkaç yolu vardır.

Cron genellikle yanlış bir şey olduğunda kullanıcıya posta gönderir. "Postanız var" mesajını görürseniz, gelen kutunuzu kontrol etmek için bir posta istemcisi kullanın . Veya, giriş dizininize bakın, orada bir dosya olabilir dead.letter.

/var/log/Cron ile ilgili girişleri kontrol edebilirsiniz . Bilgisayarımda günlük dosyası şu anda /var/log/cron/current(root erişimi gerekli).

Kök erişiminiz varsa, cron daemon'unu durdurabilir ve hata ayıklama modunda başlatabilirsiniz. Mesela ben kullanırdım ( fcrondaemon'unun ismine değiştir ):

killall fcron
fcron --foreground --debug

Daemon'umun adını nasıl bulabilirim?
ripper234

@ ripper234 kullanın ps -ef | grep cronve cronunuz için bir çizgi görmelisiniz. Hata ayıklama bayrağını görmek için cronun man sayfasını kontrol edin. Vixie Cron kullanıyor olabilirsiniz , bu durumda hata ayıklama bayrağı -x. Cron işlemini öldür ve tekrardan bayrakla başla.
Punehehe

Ayrıca / var / log / syslog komutunu da kontrol edin. Benim durumumda, cron dosyasının grup yazılabilir olduğuna dair uyarılar vardı.
iyi

1

Büyük olasılıkla, cron başarısız olduğunda, o bilgisayardaki cron işinin kullanıcı kimliğine bir e-posta gönderir. Bilgisayarınızda çalışan bir MTA'nız yoksa veya bu postayı başka bir yere okumuyorsanız veya iletmiyorsanız, MTA çalışıyor olsa bile bu mesajı görmezsiniz.

Crontab'ınızın hatalarını posta yoluyla almanın iyi bir yolu, crontab'ınızın şöyle görünmesini sağlamaktır:

MAILTO="myemail@example.com"
* * * * * echo hi >> /home/myusernae/test

Açıkçası, myemail@example.com yerine e-posta adresinizi kullanın. Bu, cron'a yerel hesap yerine e-posta adresinize hata göndermesini söyler. Özellikle, size yalnızca çıktı göndermek istediğiniz bir kök crontab'ınız (veya /etc/cron.d'deki crontab fragmanınız varsa), kökün posta kutusunu veya kökün yönlendirme adresini spam göndermekten kaçınabilirsiniz.


Sistemin yapılandırılmış bir SMTP / giden posta sunucusu olup olmadığını bilmiyorum. Olasılıklar öyle değil.
ripper234

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.