Cron: Sadece e-postalarda hata mı alıyorsun?


38

Sonunda verilerim üzerinde sıkı aralıklarla cron tarafından işlenen bir kabuk betiği üzerinden gerçekçi bir yedekleme programı oluşturdum. Ne yazık ki, CRON her çalıştırıldığında yalnızca işler yanlış gittiğinde boş e-postalar almaya devam ediyorum.

CRON'un yalnızca bir şeyler ters gittiğinde e-posta göndermesini sağlamak mümkün mü, yani. benim TARamaçlandığı gibi yürütmek değil mi?

İşte benim crontab şu an için nasıl kurulur;

0 */2 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" email@example.com

Çok teşekkürler!

Yanıtlar:


53

İdeal olarak, her şey beklendiği gibi giderse yedekleme komut dosyanızın hiçbir şey çıkmamasını ve yalnızca bir şeyler ters gittiğinde çıktı üretmesini istersiniz. Ardından, betiğiniz tarafından oluşturulan herhangi bir çıktıyı e-posta adresinize göndermek için MAILTO ortam değişkenini kullanın.

MAILTO=email@example.com
0 */2 * * * /bin/backup.sh

Komut dosyanız normal olarak çıktı oluşturuyorsa, ancak cron'da umursamıyorsanız, sadece / dev / null dizinine yolladığınızda yalnızca bir şey stderr'e yazıldığında size e-postayla gönderilir.

MAILTO=email@example.com
0 */2 * * * /bin/backup.sh > /dev/null

9
Bu pek ideal değil. Komut sıfır olmayan bir hata koduyla sona erdiğinde, genellikle çıkışın (stdout + stderr) size e-postayla gönderilmesini istiyorsunuz. Aksi taktirde, en azından stdout'u yutmak genellikle iyidir. Bana göre bu, cron'un bir tasarım hatası.
Witiko

3
@Witiko Katılıyorum; Bu soruyu düzeltmeye çalışırken buldum. Sanırım cron komutunu yapabilirsin /bin/backup.sh > log_file || (echo Backup failed with exit status $?; cat log_file)?
Daniel H,

22

Kronik sarmalayıcı komut dosyası kullanmak iyi bir fikir gibi görünüyor; kullanmak için komut dosyalarınızı değiştirmeniz gerekmez.

Onun yerine:

 0 1 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" email@example.com

yap:

 MAILTO=email@example.com
 0 1 * * * cronic /bin/backup.sh

Basit ifadeyle; her şey yolunda giderse sessiz çalışır (çıkış durumu 0), ancak değilse bile ayrıntılı olarak rapor eder ve cron'un posta raporlamasını yönetmesine izin verir.

Https://habilis.net/cronic/ adresinde daha fazla bilgi bulabilirsiniz .


Sorunun yanlış bir cron çizgisinden başka bir şey olmadığı ve cronun yapması söyleneni yaptığı şeyleri yapması nasıl işe yarayacağını gerçekten anlamıyorum.
John Gardeniers

3
@JohnGardeniers yardımcı olur çünkü bazen hatasız çıktı alırsınız.
Mikhail

11
Alternatif olarak, chronicgelen moreutilspakette: joeyh.name/code/moreutils
Vladimir Panteleev

4

Özellikle (bu arada olması gereken ) başarılı cronolsa bile, her zaman e-posta göndermeniz için talimat /bin/backup.shveriyorsunuz /usr/local/bin. Sadece | mail -s "Backup status" email@example.comkısmı atlayın ve e-posta yalnızca çıktı olduğunda gönderilir. Muhtemelen (size bağlı olarak cron) e-posta adresini crontab dosyasında bir atama olarak postayla açıkça ayarlayabilirsiniz.

Ayrıntılar için bkz.

man 5 crontab

3

Sen yönlendirmelidir stderrikisini anmd stdoutve stderr.

Kullanım 1> /dev/nulldeğil 2>&1ve ince olmalıdır. Ayrıca, hatayı yedekleme komut dosyanızda doğru şekilde bildirmeniz gerekebilir.


3

Uzun yıllardır başarıyla kullandığım bir başka varyasyon - çıktıyı yakalamak ve yalnızca bir hatayla yazdırmak , bir e-postayı tetiklemek. Bu, geçici dosyalar gerektirmez ve tüm çıktıları korur . Önemli 2>&1olan STDERR'i STDOUT'a yönlendiren kısımdır .

Çıktının tamamını varsayılan cron mailer config ile gönderin:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT"

Aynı ancak belirli bir adres ve konuyla:

(Adres , tüm crontab dosyası için MAILTO = xxxx ayarlanarak da değiştirilebilir )

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT" | mail -s "Failed to backup" an@email.address

Hata durumunda birden fazla işlem gerçekleştirebilir ve e-postaya ekleyebilirsiniz:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || {echo "$OUTPUT" ; ls -ltr /backup/dir ; }

Bu basit komutlar için işe yarayacaktır. Eğer karmaşık borular ( find / -type f | grep -v bla | tar something-or-other) ile uğraşıyorsanız , komutu bir betiğe taşımanız ve bahsi geçen yaklaşımı kullanarak betiği çalıştırmanız daha iyi olacaktır. Bunun nedeni, borunun herhangi bir kısmının STDERR'ye çıkış yapması durumunda, hala e-posta alacak olmanızdı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.