Bagaimana saya hanya dapat menerima email dari cron jika ada kesalahan?
Dalam sebagian besar kasus, tugas akan berjalan dengan baik - dan saya benar-benar tidak peduli dengan hasilnya.
Hanya dalam kasus yang jarang terjadi kegagalan yang saya ingin / perlu tahu.
Saya memiliki procmail yang tersedia - tetapi saya tidak yakin apakah yang saya jelaskan dapat dikelola secara eksternal ke cron "dengan benar".
cron
email
error-handling
warren
sumber
sumber
Jawaban:
Karena Anda tidak mempedulikan output, Anda dapat mengarahkan kembali STDOUT suatu pekerjaan ke
/dev/null
dan membiarkan STDERR dikirim melalui surat (menggunakanMAILTO
variabel lingkungan).Jadi, misalnya:
akan mengirim email ketika hanya ada keluaran di STDERR (dengan STDERR), dan akan membuang STDOUT.
Ini tentu saja mengasumsikan bahwa ketika sebuah program telah menulis di STDERR, telah gagal; ini mungkin tidak selalu terjadi. Jika Anda memiliki kendali atas program, Anda dapat membuatnya melakukannya. Untuk kasus rumit apa pun, Anda harus menulis semacam pembungkus yang menjalankan perintah dan mengirim email sesuai dengan itu. Dan letakkan pembungkusnya sebagai
cron
pekerjaan.sumber
The
chronic
perintah dari MoreUtils menjalankan perintah diam-diam kecuali gagal.Mengutip dari manualnya:
sumber
Anda bisa membungkus permintaan cron Anda dengan cronic , skrip shell yang memakan output cron kecuali kode pengembalian dari proses yang dipanggil tidak nol atau ada output kesalahan non-trace.
Untuk menggunakan cronic, unduh skrip ke lokasi yang sesuai, seperti
/usr/local/bin
. Entri crontab Anda harus diawali dengan path ke skrip (mis./usr/local/bin/cronic
), Atau sederhananyacronic
, asalkan AndaPATH
diatur dengan benar.Perhatikan bahwa "kesalahan" adalah istilah yang tidak jelas dalam pertanyaan Anda dan membutuhkan definisi yang cermat. Agar cronic bermanfaat, Anda harus memastikan pekerjaan yang Anda bungkus dengan kesalahan laporan kronis dalam salah satu cara mendefinisikan kondisi kesalahan. Metode pelaporan implisit, seperti menulis string teks
STDOUT
, akan memerlukan pemikiran lebih lanjut untuk membuat ini kompatibel dengan cron atau mekanisme pelaporan cron lainnya.Pembungkus lain tersedia, seperti yang ditautkan dari situs kronis:
sumber
cronic
terkait denganchronic
, atau itu hanya kebetulan?cronic
diimplementasikan dalam bash,chronic
seperti yang disarankan dalam jawaban sebelumnya adalah skrip Perl.Berikut adalah variasi lain yang telah berhasil saya manfaatkan selama bertahun-tahun - tangkap keluaran dan cetak hanya dengan kesalahan . Ini tidak memerlukan file temp, dan mempertahankan semua output . Bagian yang penting adalah
2>&1
yang mengarahkan ulang STDERR ke STDOUT.Kirim seluruh output melalui konfigurasi cron mailer default:
Sama tetapi dengan alamat dan subjek tertentu:
Anda bahkan dapat melakukan beberapa tindakan saat terjadi kesalahan dan menambahkan ke email:
Ini akan bekerja untuk perintah sederhana. Jika Anda berurusan dengan pipa kompleks (
find / -type f | grep -v bla | tar something-or-other
), maka Anda lebih baik memindahkan perintah ke skrip dan menjalankan skrip menggunakan pendekatan yang disebutkan di atas. Alasannya adalah jika ada bagian dari pipa yang menghasilkan STDERR, Anda masih akan mendapatkan email.sumber
$OUTPUT
dalam tanda kutip:"$OUTPUT"
.Saya mungkin belum memikirkan hal ini sepenuhnya, tetapi
akan, dalam kasus biasa, mengalihkan semua ke file sementara (Anda mungkin ingin menggunakan
mktemp
untuk mendapatkan nama file yang unik), menghapusnya jika file tersebut berhasil, dan kemudiancat
isinya lagi, jika masih ada (mis. yourthing.sh keluar dengan kondisi kesalahan), untuk diambil oleh cron mailer.Jika ingatanku, cron sudah tidak mengirim apa pun jika tidak ada output, jadi jika file log kosong atau tidak ada, tidak ada yang terjadi. (Kami mengalihkan pesan kesalahan.)
sumber