Mencatat SEMUA stderr output dari crontab ke file

12

Misalnya, saya bisa mencatat stderrsatu skrip dengan cara ini:

* * * * * run_script.sh > /var/log.txt 2>&1

Tapi saya ingin mencatat stderrsemua skrip di crontab saya. Saya dapat menambahkan > /var/log.txt 2>&1ke semua skrip, tetapi tidak baik jika saya memiliki ratusan skrip cron. Apakah ada cara lain yang lebih sederhana untuk melakukan ini?

Maslov Anton
sumber

Jawaban:

6

Di crontab, Anda dapat mengatur MAILTO untuk menunjuk ke email alias yang menjalankan skrip. Script itu akan menerima pesan email, menanggalkan header dan goop lainnya, dan mencatat sisanya dengan logger. Karena semua output skrip cron dikirim ke alamat yang ditentukan oleh MAILTO, Anda akan menangkap semuanya.

Contoh: di crontab

MAILTO=myalias

Di / etc / mail / aliases (anggap Anda menggunakan sendmail)

myalias:"|/usr/local/bin/my-processing-script.sh"

dan minta script strip dari header mail dan proses output cron.

Kyle Jones
sumber
dapatkah Anda lebih spesifik tentang pengaturan MAILTO, alias, MTA, skrip, dll?
endolith
1
@endolith Saya telah mengedit jawaban untuk memberikan pengaturan dasar yang berfungsi untuk sendmail dan MTA yang kompatibel secara luas. Anda harus menulis skrip sendiri.
Kyle Jones
5

Setiap output yang dihasilkan oleh suatu perintah dikirimkan kepada pengguna yang ditentukan dalam variabel lingkungan MAILTO sebagaimana diatur dalam file crontab (5) atau, jika tidak ada variabel MAILTO yang ditetapkan (atau jika ini adalah pekerjaan at (1) atau batch (1) ), kepada pemilik pekerjaan. Jika suatu perintah tidak menghasilkan output atau jika variabel lingkungan MAILTO diatur ke string kosong, tidak ada surat akan dikirim.

Karena menggunakan surat lokal, Anda benar-benar tidak perlu mengatur apa pun, atau mungkin hanya menginstal mailx jika belum ada di sini. Cron akan mengirimkan output kepada Anda, Anda dapat menyimpan email dalam file dan melakukan banyak hal dari sana. Mencoba mengubah cara cron bekerja agar sesuai dengan kebutuhan Anda bukanlah cara yang tepat. Jika Anda tidak berpikir demikian, tambal dan pasang kembali cron, sebut saja my_cron dan gunakan sebagai ganti cron. Dan bersiaplah untuk akhirnya memperbarui my_cron Anda dan membangunnya kembali sesering mungkin.

Tambahkan ini di awal semua skrip Anda untuk mencatat semuanya dan berhenti pada kesalahan pertama

exec 2>&1 > /var/log/YOUR_LOG_FILE
set -e
Aki
sumber
haruskah urutan pengalihan sebaliknya? > /var/log/YOUR_LOG_FILE 2>&1yaitu, redirect stdout pertama ke file dan hanya kemudian redirect stderr ke stdout (yang sekarang menunjuk ke file).
jfs
Cukup gila bahwa di server minimal Anda perlu menginstal layanan surat, dan mungkin klien surat, hanya untuk membaca kesalahan yang dihasilkan oleh Cron. Rasanya seperti keputusan desain anarkistik.
James McMahon
0

Skrip Ryan Ye di /programming//a/7145618/20774 juga berguna untuk ini, meskipun ia menggunakan stdout dan stderr.


Saya memiliki skrip cronlog.sh kecil untuk melakukan ini. Kode skrip

#!/bin/sh
echo "[`date`] Start executing $1"
$@ 2>&1 | sed -e "s/\(.*\)/[`date`] \1/"
echo "[`date`] End executing $1"

Maka Anda bisa melakukannya

cronlog.sh /opt/scripts/sql_fetch >> your_log_file

Contoh hasil

cronlog.sh echo 'hello world!'

[Mon Aug 22 04:46:03 CDT 2011] Start executing echo
[Mon Aug 22 04:46:03 CDT 2011] helloworld!
[Mon Aug 22 04:46:03 CDT 2011] End executing echo
James McMahon
sumber