cron
sudah mengirimkan keluaran standar dan kesalahan standar setiap pekerjaan yang dijalankan melalui pos ke pemilik pekerjaan cron.
Anda dapat menggunakan MAILTO=recipient
dalam crontab
file untuk mengirim email ke akun lain.
Agar ini berfungsi, Anda harus memiliki surat yang berfungsi dengan baik. Mengirim ke kotak surat lokal biasanya bukan masalah (pada kenyataannya, kemungkinan besar ls -l "$MAIL"
akan mengungkapkan bahwa Anda telah menerima beberapa) tetapi mengeluarkannya dari kotak dan keluar ke internet membutuhkan MTA (Postfix, Sendmail, apa yang Anda) untuk dikonfigurasikan dengan benar untuk terhubung ke dunia.
Jika tidak ada output, tidak ada email yang akan dihasilkan.
Pengaturan umum adalah untuk mengarahkan output ke file, dalam hal ini tentu saja daemon cron tidak akan melihat pekerjaan mengembalikan output apa pun. Varian adalah untuk mengarahkan output standar ke file (atau menulis skrip sehingga tidak pernah mencetak apa pun - mungkin ia menyimpan hasil dalam database sebagai gantinya, atau melakukan tugas pemeliharaan yang tidak menghasilkan apa-apa?) Dan hanya menerima email jika ada adalah pesan kesalahan.
Untuk mengarahkan ulang kedua aliran output, sintaksnya adalah
42 17 * * * script >>stdout.log 2>>stderr.log
Perhatikan bagaimana kita menambahkan (dua kali lipat >>
) alih-alih menimpa, sehingga output pekerjaan sebelumnya tidak diganti oleh yang berikutnya.
Seperti yang disarankan dalam banyak jawaban di sini, Anda dapat meminta kedua aliran output dikirim ke satu file; ganti pengalihan kedua dengan 2>&1
mengatakan "kesalahan standar harus pergi ke mana pun output standar pergi". (Tapi saya tidak terlalu mendukung praktik ini. Terutama masuk akal jika Anda tidak benar-benar mengharapkan sesuatu pada output standar, tetapi mungkin telah mengabaikan sesuatu, mungkin berasal dari alat eksternal yang dipanggil dari skrip Anda.)
cron
pekerjaan dijalankan di direktori home Anda, jadi setiap nama file relatif harus relatif terhadap itu. Jika Anda ingin menulis di luar direktori home Anda, Anda harus secara terpisah memastikan Anda memiliki akses tulis ke file tujuan tersebut.
Antipattern yang umum adalah mengarahkan ulang semuanya ke /dev/null
(dan kemudian meminta Stack Overflow untuk membantu Anda mencari tahu apa yang salah ketika ada sesuatu yang tidak bekerja; tetapi kita juga tidak dapat melihat output yang hilang!)
Dari dalam skrip Anda, pastikan untuk menjaga keluaran reguler (hasil aktual, idealnya dalam bentuk yang dapat dibaca mesin) dan diagnostik (biasanya diformat untuk pembaca manusia) terpisah. Dalam skrip shell,
echo "$results" # regular results go to stdout
echo "$0: something went wrong" >&2
Beberapa platform (dan mis. GNU Awk) memungkinkan Anda untuk menggunakan nama file /dev/stderr
untuk pesan kesalahan, tetapi ini tidak portabel; di Perl, warn
dan die
cetak ke kesalahan standar; dengan Python, tulis ke sys.stderr
, atau gunakan logging
; di Ruby, coba $stderr.puts
. Perhatikan juga bagaimana pesan kesalahan harus menyertakan nama skrip yang menghasilkan pesan diagnostik.