Nonaktifkan email cron kecuali ada kesalahan?

12

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".

warren
sumber
Bagaimana jika crond itu sendiri tidak berjalan? Atau mesin sedang offline? Itu sebabnya saya tidak pernah repot dengan email dari cron dan menggunakan layanan pemantauan cron khusus. Saya tidak setuju dengan WDT.io dan merekomendasikannya.
Christian Pekeler

Jawaban:

8

Karena Anda tidak mempedulikan output, Anda dapat mengarahkan kembali STDOUT suatu pekerjaan ke /dev/nulldan membiarkan STDERR dikirim melalui surat (menggunakan MAILTOvariabel lingkungan).

Jadi, misalnya:

...
...
[email protected]
...
...
* * * * * /my/script.sh >/dev/null

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 cronpekerjaan.

heemayl
sumber
1
Kelemahan dari pendekatan ini adalah ketika gagal Anda hanya mendapatkan output STDERR yang dapat membuat diagnosis lebih sulit daripada jika Anda memiliki output penuh.
plugwash
11

The chronicperintah dari MoreUtils menjalankan perintah diam-diam kecuali gagal.

Mengutip dari manualnya:

kronis menjalankan perintah, dan mengatur keluar standar dan kesalahan standar hanya ditampilkan jika perintah gagal (keluar bukan nol atau crash). Jika perintah berhasil, output asing akan disembunyikan.

Penggunaan umum untuk kronis adalah untuk menjalankan pekerjaan cron. Alih-alih mencoba untuk menjaga perintah diam, dan harus berurusan dengan mail yang berisi output tidak disengaja ketika berhasil, dan tidak memberikan cukup output ketika gagal, Anda hanya dapat menjalankannya secara lisan, dan menggunakan kronis untuk menyembunyikan output yang sukses.

Michał Politowski
sumber
8

Bagaimana saya hanya dapat menerima email dari cron jika ada kesalahan?

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 sederhananya cronic, asalkan Anda PATHdiatur 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:

Ossifrage Kosmik
sumber
1
Apakah cronicterkait dengan chronic, atau itu hanya kebetulan?
Toby Speight
Sepertinya kebetulan @TobySpeight. cronicdiimplementasikan dalam bash, chronicseperti yang disarankan dalam jawaban sebelumnya adalah skrip Perl.
Cosmic Ossifrage
4

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>&1yang mengarahkan ulang STDERR ke STDOUT.

Kirim seluruh output melalui konfigurasi cron mailer default:

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

Sama tetapi dengan alamat dan subjek tertentu:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT" | mail -s "Failed to backup" [email protected]

Anda bahkan dapat melakukan beberapa tindakan saat terjadi kesalahan dan menambahkan ke email:

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

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.

Akom
sumber
Anda harus meletakkan $OUTPUTdalam tanda kutip: "$OUTPUT".
G-Man Mengatakan 'Reinstate Monica'
@ G-Man Fair point, selalu ada kemungkinan bahwa output mungkin mengandung "-n" atau yang serupa.
Akom
0

Saya mungkin belum memikirkan hal ini sepenuhnya, tetapi

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

akan, dalam kasus biasa, mengalihkan semua ke file sementara (Anda mungkin ingin menggunakan mktempuntuk mendapatkan nama file yang unik), menghapusnya jika file tersebut berhasil, dan kemudian catisinya 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.)

Ulrich Schwarz
sumber