Bagaimana cara mendapatkan e-mail dari cron-job di Ubuntu?

45

Saya membuat cron-job di Ubuntu dengan menempatkan executable di salah satunya /etc/cron.{daily,hourly,monthly,weekly}. Ada banyak direktori yang dimulai dengan cron:

kent@rat:~$ ls -ld /etc/cron*
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.d
drwxr-xr-x 2 root root 4096 2009-07-16 13:17 /etc/cron.daily
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.hourly
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.monthly
-rw-r--r-- 1 root root  724 2009-05-16 23:49 /etc/crontab
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.weekly

Saya ingin mendapatkan email dari skrip saya ketika:

  1. Skrip gagal dan memberikan kode keluar yang bukan nol.
  2. Script memiliki sesuatu untuk diceritakan

Saya sudah menginstal dan bekerja SSMTP , saya mengirim email dari akun Google saya. Fakta bahwa SSMTP hanya dapat mengirim email menggunakan satu akun bukan masalah bagi saya. Ini hanya server rumah dan pengguna yang saya miliki tidak memiliki kemampuan untuk menambahkan cron-job.

Saya ingin tahu bagaimana mailing dari skrip biasanya bekerja di Linux / Unix secara umum dan di Ubuntu secara khusus. Saya juga ingin tahu cara yang baik bagi saya untuk mendapatkan email dalam dua situasi di atas.

Dihapus
sumber

Jawaban:

60

Secara default, cron akan mengirim email ke pemilik akun tempat crontab berjalan.

Crontab seluruh sistem ada di / etc / crontab berjalan di bawah pengguna `root '

Karena root digunakan secara luas, saya sarankan menambahkan alias root ke file / etc / aliases Anda. (jalankan 'newaliases' setelah)

Cara normal untuk struktur ini adalah untuk root untuk alias ke pengguna lain pada sistem, misalnya bagi saya saya akan alias 'root' ke 'phil' (akun pengguna saya) dan alias 'phil' ke alamat email eksternal saya.

Jika Anda memiliki cron pengguna tertentu yang ingin Anda kirimi email kepada Anda pada output, Anda dapat menggunakan / etc / aliases lagi (asalkan Anda memiliki akses pengguna super) untuk mengarahkan pengguna ke alamat email lain, atau Anda dapat menggunakan yang berikut di atas crontab Anda:

MAILTO="[email protected]"

Jika surat harus dikirim ke pengguna lokal, Anda dapat memasukkan nama pengguna saja:

MAILTO=someuser

Jika Anda memerlukan informasi lebih lanjut, lihat crontab (5) dengan menjalankan:

man 5 crontab
Philip Reynolds
sumber
Bukankah /etc/aliasesentri seharusnya mengikuti format name: value1, value2, ... ? Saya tidak tahu, mungkin formatnya diubah di beberapa titik dalam 8 tahun terakhir.
Nathan Jones
1
"Untuk saya, saya akan alias 'root' ke 'phil' (akun pengguna saya) dan alias 'phil' ke alamat email eksternal saya." Bagaimana cara alias 'phil' ke alamat email eksternal?
Howard Lee
29

Untuk mendapatkan email yang dikirim dari vixie cron, Anda perlu sesuatu yang mereplikasi perintah sendmail. Jadi menginstal postfix atau SSMTP akan menyelesaikan bagian ini. Jika Anda menggunakan postfix maka file alias dapat digunakan untuk memetakan pengguna sistem ke alamat email asli.

Menambahkan MAILTO = "[email protected]" ke bagian atas crontab akan menyebabkan semua output dari tugas cron diemail. Ini terlepas dari kode kesalahan.

Untuk skrip yang menampilkan kesalahan dengan benar ke STDERR, maka mudah untuk diemail hanya ketika mereka salah lakukan saja:

MAILTO="[email protected]"
0 5 * * * /bin/some_script > /dev/null

Ini akan mengarahkan hanya STDOUT ke nol. Jika ada pesan STDERR, mereka akan menerima email kepada Anda.

Namun, saya telah menemukan beberapa skrip akan menampilkan kesalahan sebagai STDOUT dan mengatur kode keluar ke 1. Saya belum menemukan cara untuk mengambil output dari ini, tetapi abaikan output jika kode keluar adalah 0. Satu-satunya metode Yang bisa saya pikirkan adalah untuk mengarahkan kembali output ke file, maka jika kode keluar tidak 0 output file itu untuk cron untuk ambil. Sepertinya cukup mengerikan.

Theozaurus
sumber
3
Bisa coba habilis.net/cronic
dfrankow
8

Jika Anda ingin mengirim semua output (stdout dan stderr) ke alamat tertentu maka Anda dapat menggunakan MAILTOvariabel. Misalnya, tempatkan yang berikut di bagian atas skrip.

MAILTO="[email protected]"
Dan Carley
sumber
5

coba tambahkan "root: [email protected]" ke / etc / aliases

yang akan mengirim semua pesan untuk pengguna itu ke email Anda. jika Anda tidak ingin semua pesan, Anda dapat membuat pengguna khusus untuk ini.

Selama skrip menampilkan sesuatu, Anda akan mendapatkan email.

Daniel P
sumber
3

Pada semua server produksi saya yang biasanya menjalankan sekitar 20 cronjobs setiap hari saya bersumpah dengan paket python-cronwrap. Lihat di sini: http://pypi.python.org/pypi/cronwrap . Ini sangat mudah untuk dikonfigurasi dan yang paling dapat diandalkan.

Low Kian Seong
sumber
2

Saya tidak berpikir SSMTP dapat melakukan apa yang Anda butuhkan. Anda memerlukan sesuatu yang dapat "menerima" surat dari proses cron dan kemudian mengirimkannya ke kotak surat Anda yang sebenarnya.

Saya menggunakan Sendmail, tapi itu karena saya tangan Sun yang lama; Saya tahu itu ditertawakan oleh semua anak keren hari ini yang menggunakan Postfix. Komunitas ubuntu Anda dapat memandu Anda mengatur sistem email Anda.

David Mackintosh
sumber
ssmtp mengimplementasikan / bin / sendmail
bobpaul
2

Alternatif - saya mengarsipkan semua root mail ke beberapa file, dan kemudian menghapus email asli.

Saya cron skrip (di sini adalah bagian kunci) -

#!/bin/bash
if `/usr/bin/mail -e`; then
   /usr/bin/mail --print 2>&1 > /tmp/email_${date +"%Y-%m-%d_%H.%M").log
   echo ‘d *’ | /usr/bin/mail -N > /dev/null
fi
exit 0

Ini membuat segalanya rapi dan saya bisa mengawasinya. Saya dapat mengirim email file surat harian ke id email eksternal, dll ...

irdroid3
sumber