Cron: Hanya mendapatkan kesalahan dalam email?

39

Saya akhirnya mengatur jadwal cadangan realistis pada data saya melalui skrip shell, yang ditangani oleh cron pada interval yang ketat. Sayangnya, saya terus menerima email kosong setiap kali CRON dieksekusi dan tidak hanya ketika ada masalah.

Apakah mungkin untuk hanya membuat CRON mengirim email ketika ada masalah, yaitu. saya TARtidak mengeksekusi sebagaimana dimaksud?

Begini cara crontab saya diatur untuk saat ini;

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

Terima kasih banyak!

Industri
sumber

Jawaban:

54

Idealnya Anda ingin agar skrip cadangan Anda tidak menghasilkan apa-apa jika semuanya berjalan seperti yang diharapkan dan hanya menghasilkan keluaran ketika ada yang salah. Kemudian gunakan variabel lingkungan MAILTO untuk mengirim output apa pun yang dihasilkan oleh skrip Anda ke alamat email Anda.

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

Jika skrip Anda biasanya menghasilkan keluaran tetapi Anda tidak peduli dengan cron, kirimkan saja ke / dev / null dan itu akan mengirimi Anda email hanya ketika ada sesuatu yang ditulis ke stderr.

MAILTO=email@example.com
0 */2 * * * /bin/backup.sh > /dev/null
Cakemox
sumber
9
Ini hampir tidak ideal. Anda umumnya ingin seluruh output (stdout + stderr) diemailkan kepada Anda ketika perintah berakhir dengan kode kesalahan bukan nol. Kalau tidak, umumnya baik-baik saja untuk melahap setidaknya stdout. Bagi saya, ini adalah cacat desain cron.
Witiko
3
@ Waniko saya setuju; Saya menemukan pertanyaan ini mencoba untuk memperbaikinya. Saya kira Anda dapat membuat perintah cron Anda /bin/backup.sh > log_file || (echo Backup failed with exit status $?; cat log_file)?
Daniel H
22

Menggunakan skrip pembungkus kronis sepertinya ide yang bagus; untuk menggunakannya Anda tidak perlu mengubah skrip Anda.

Dari pada:

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

melakukan:

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

Sederhananya; itu akan berjalan diam jika semuanya berjalan lancar (keluar status 0), tetapi akan melaporkan secara lisan jika tidak, dan biarkan cron menangani pelaporan surat.

Info lebih lanjut tentang https://habilis.net/cronic/ .

Ricardo Pardini
sumber
Saya benar-benar tidak melihat bagaimana itu akan membantu ketika masalahnya tidak lebih dari garis cron yang salah dan cron melakukan persis apa yang diperintahkan untuk dilakukan.
John Gardeniers
3
@JohnGardeniers itu membantu karena kadang-kadang Anda memiliki output tanpa kesalahan.
Mikhail
11
Atau, chronicdari moreutilspaket: joeyh.name/code/moreutils
Vladimir Panteleev
4

Anda secara khusus diinstruksikan cronuntuk selalu mengirim email, bahkan ketika /bin/backup.sh(ngomong-ngomong, seharusnya /usr/local/bin) masuk Hapus saja | mail -s "Backup status" [email protected]bagian dan email hanya akan dikirim ketika ada output. Anda mungkin dapat (tergantung pada Anda cron) secara eksplisit mengatur alamat email untuk dikirimkan sebagai tugas dalam file crontab.

Untuk detailnya, lihat

man 5 crontab
reinierpost
sumber
3

Anda harus mengarahkan stderranmd bukan keduanya stdoutdan stderr.

Gunakan 1> /dev/nulltidak 2>&1dan itu harus baik-baik saja. Selain itu, Anda mungkin perlu melaporkan kesalahan dengan benar di skrip cadangan Anda.

Khaled
sumber
3

Berikut adalah variasi lain yang telah berhasil saya manfaatkan selama bertahun-tahun - menangkap keluaran dan mencetaknya hanya karena kesalahan , memicu email. 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:

(alamat juga dapat diubah dengan mengatur MAILTO = xxxx untuk seluruh file crontab)

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

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 berfungsi 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 bahwa jika ada bagian dari pipa yang menghasilkan STDERR, Anda masih akan mendapatkan email.

Akom
sumber