Hanya email tentang kesalahan cron untuk pekerjaan di cron.daily, cron.hourly, dll

8

Saya punya beberapa pekerjaan cron yang berjalan (di /etc/cron.daily, /etc/cron.hourly, /etc/cron.weekly, dll) dan email root@localhostdengan hasil. Saya ingin menghentikan email-email itu jika pekerjaannya berhasil, dan hanya email yang salah (yang saya pahami dapat dilakukan dengan mengarahkan ulang stdoutke /dev/null). Saya mengerti bagaimana melakukan itu untuk pekerjaan cron individu, tetapi skrip di direktori khusus tersebut dijalankan menggunakan run-parts. Apa cara terbaik untuk menekan email yang berhasil untuk skrip tersebut?

jrdioko
sumber

Jawaban:

5

Anda mungkin ingin menggunakan salah satu pembungkus untuk program, yang menghasilkan semuanya ketika ada yang buruk dan menelan stdout sebaliknya.

Salah satu contoh mungkin cronic , cukup tambahkan 'cronic' ke 'run-parts' misalnya:

# m h dom mon dow user  command
 17 *  *   *   *  root  cd / && /etc/cronic run-parts --report /etc/cron.hourly

di mana /etc/cronicada tempat dengan skrip kronik yang dapat dieksekusi, diunduh dari situs web yang disebutkan.

Cyryl Płotnicki
sumber
5

Anda harus mengirim pemberitahuan email yang berhasil ke /dev/nullmereka sehingga menghilang.

Tetapi Anda ingin melihat notifikasi email yang gagal .

Ini berarti Anda harus mengarahkan langsung stdoutke /dev/nulldan kemudian mengarahkan /dev/stderrkestdout

coba ubah bagian pengalihan cronjobs Anda menjadi

>/dev/null 2>&1

Lihat tautan ini

pavium
sumber
Bukankah itu juga akan menekan email kesalahan (karena mereka tidak akan menghasilkan output)? Juga, saya perlu melakukan ini untuk cron.XXXdirektori saya yang digunakan run-parts, jadi tidak sesederhana mengarahkan ulang untuk masing-masing skrip.
jrdioko
Tidak idenya adalah yang stderrdibuang kemudian stderr diarahkan ke stdout. Saya tidak yakin apa run-partsitu, tetapi bagaimanapun itu berfungsi pengalihan stdoutdan kemudian stderrtampaknya menjadi jalannya.
pavium
Aha, saya googled run-parts. Itu menyulitkan masalah, bukan. Mungkin Anda harus menghindari run-partsdan memanggil setiap skrip secara terpisah.
pavium
Ah ok, saya mengerti. run-partsmenjalankan semua skrip dalam direktori seperti /etc/cron.daily, jadi triknya adalah meneruskan pengalihan ke skrip individual yang sedang dijalankan.
jrdioko
2
Apakah Anda yakin tentang >/dev/null 2>&1bit? Saya mengujinya dan itu menyalurkan semuanya /dev/null, di mana jika Anda menjatuhkan 2>&1stdout saja dihapus.
jrdioko
1
  • Jika skrip berperilaku baik, ia hanya akan menulis STDOUTjika berhasil, dan STDERRjika ada kesalahan.
  • Secara default, cron akan mengirimkan semua yang dituliskan ke dalam skrip STDOUT atau STDERR ( Arch wiki ).

Jadi, jika Anda ingin menyimpan pemberitahuan kesalahan, jangan redirect STDERR, cukup STDOUT:

COMMAND > /dev/null

Jika Anda melakukan tipikal >/dev/null 2>&1, Anda secara efektif menekan keduanya ( dokumentasi bash ).

  1. Buat stdinfile descriptor salinan / dev / null.
  2. Buat stderrfile descriptor salinan stdout(yang sudah menunjuk ke / dev / null).
morallo
sumber
Bahkan jika ini tidak sepenuhnya menjawab pertanyaan asli, itu mengatasi beberapa kesalahan dalam balasan pavium .
morallo