Hata olmadığı sürece cron e-postaları devre dışı bırakılsın mı?


12

Yalnızca hatalar varsa cron'dan e-postaları nasıl alabilirim?

Vakaların büyük çoğunluğunda, görevler gayet iyi çalışacaktır - ve çıktıyı gerçekten umursamıyorum.

Bilmek istediğim / bilmem gereken nadir bir arıza durumunda.

Ben procmail mevcut - ama ben tanımlamak ne harici olarak cron "doğru" yönetmek mümkün olup olmadığından emin değilim.


Ya crond kendisi çalışmıyorsa? Yoksa makine çevrimdışı mı? Bu yüzden asla cron'dan gelen e-postalarla uğraşmam ve özel bir cron izleme hizmeti kullanmam. WDT.io'nun kısmi ve tavsiye ederim.
Christian Pekeler

Yanıtlar:


8

/dev/nullÇıktıya önem vermediğiniz için , bir işin STDOUT'unu yeniden yönlendirebilir ve STDERR'ın posta yoluyla ( MAILTOortam değişkenini kullanarak ) gönderilmesine izin verebilirsiniz .

Yani mesela:

...
...
MAILTO=foobar@example.com
...
...
* * * * * /my/script.sh >/dev/null

yalnızca STDERR'da (STDERR ile) çıktı olduğunda posta gönderir ve STDOUT'u atar.

Bu tabii ki bir program STDERR üzerine yazdığında başarısız olduğunu varsayar; bu her zaman böyle olmayabilir. Program üzerinde kontrolünüz varsa, bunu yapabilirsiniz. Herhangi bir karmaşık durum için, komutları çalıştıran bir tür sarıcı yazmalı ve buna göre posta göndermelisiniz. Ve sargıyı croniş olarak koy .


1
Bu yaklaşımın dezavantajı, başarısız olduğu zaman, yalnızca tam çıktıya sahip olduğunuzdan daha zor tanı koyabilen STDERR çıktısını almanızdır.
plugwash

11

chronicDan komut moreutils başarısız sürece sessizce bir komut çalıştırır.

Kılavuzundan alıntı:

chronic bir komutu çalıştırır ve standart komutunun ve standart hatanın yalnızca komut başarısız olduğunda (sıfırdan çıkar veya çökerse) görüntülenmesini düzenler. Komut başarılı olursa, harici çıktılar gizlenir.

Kronik için yaygın bir kullanım, bir cron işi yürütmektir. Komutu sessiz tutmaya çalışmak ve başarısız olduğunda yanlışlıkla çıktı içeren postalarla uğraşmak yerine ve başarısız olduğunda yeterli çıktı vermeden ziyade, her zaman özenle çalıştırabilir ve başarılı çıktıyı gizlemek için kronik kullanabilirsiniz.


8

Yalnızca hatalar varsa cron'dan e-postaları nasıl alabilirim?

Cron çağrılarınızı , çağrılan işlemin dönüş kodu sıfırdan farklı veya izleme hatası olmayan bir çıktı olmadığı sürece cron çıktısını yiyen bir kabuk betiği olan kronik ile sarabilirsiniz .

Kronik kullanmak için, komut dosyasını uygun bir konuma indirin /usr/local/bin. Crontab girişlerinize, komut dosyasının yolu (ör. /usr/local/bin/cronic) İle öneki gelmeli veya basitçe cronic, sizin PATHdüzgün ayarlanmışsa.

"Hataların" sorunuzda kötü tanımlanmış bir terim olduğunu ve dikkatli bir tanım gerektirdiğini unutmayın. Kronik işlerin yararlı olması için, kronik rapor hatalarıyla sardığınız işlerin bir hata koşulunu tanımlama yöntemlerinden birini kullanarak sağlamanız gerekir. Metin dizeleri yazmak gibi örtük raporlama yöntemleri STDOUT, bunu kronik veya başka bir cron raporlama mekanizmasıyla uyumlu hale getirmek için daha fazla düşünmeyi gerektirecektir.

Kronik bölgeye bağlı olarak diğer ambalajlar da mevcuttur:


1
Is cronicilgili chronicveya bu sadece tesadüf mü?
Toby Speight

@TobySpeight Tesadüf gibi görünüyor. önceki yanıtta önerildiği gibi bir Perl betiği olarak cronicbash içinde uygulanır . chronic
Kozmik Ossifrage

4

İşte uzun yıllardır başarıyla kullandığım başka bir varyasyon - çıktıyı yakalayın ve sadece hatayla yazdırın . Bu geçici dosyalar gerektirmez ve tüm çıktıları korur . Önemli 2>&1olan STDERR'ı STDOUT'a yönlendirmesidir.

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

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

Aynı ancak belirli bir adres ve konu ile:

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

Hatta 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 yarar. Karmaşık borular ( find / -type f | grep -v bla | tar something-or-other) ile uğraşıyorsanız , komutu bir komut dosyasına taşımak ve yukarıda belirtilen yaklaşımı kullanarak komut dosyasını çalıştırmak daha iyi olur. Bunun nedeni, borunun herhangi bir kısmı STDERR'a çıktıysa, yine de e-posta almanızdır.


Sen koymalıyız $OUTPUTtırnak içinde: "$OUTPUT".
G-Man,

@ G-Man Fair point, çıktı her zaman "-n" veya benzeri bir şey içerebilir şansı vardır.
Akom

0

Muhtemelen bunu hiç düşünmemiştim, ama

* * * * * yourthing.sh >/tmp/yourthing.log && rm -f /tmp/yourthing.log; cat /tmp/yourthing.log 2>/dev/null

olağan durumlarda, her şeyi geçici bir dosyaya yönlendirir (muhtemelen mktempbenzersiz bir dosya adı elde etmek için kullanmak istersiniz ), dosya başarılı catolduysa ve daha sonra yine de varsa içeriği tekrar silinir (yani, yourthing.sh çıkıldı) hata koşulu ile), cron mailler tarafından alınacaktır.

Bellek sunuluyorsa, cron zaten çıktı yoksa hiçbir şey göndermez, bu nedenle günlük dosyası boşsa veya yoksa, hiçbir şey olmaz. (Hata mesajını yeniden yönlendiriyoruz.)

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.