Saya ingin tahu bagaimana saya bisa melihat dengan tepat apa yang dilakukan tugas cron pada setiap eksekusi. Di mana file-file log berada? Atau bisakah saya mengirim hasilnya ke email saya? Saya telah menetapkan alamat email untuk mengirim log ketika pekerjaan cron berjalan tetapi saya belum menerima apa pun.
218
Jawaban:
akan mencatat semua output dari pekerjaan cron ke /var/log/myjob.log
Anda mungkin menggunakan
mail
untuk mengirim email. Sebagian besar sistem akan mengirimkancron
hasil pekerjaan yang tidak ditangani melalui email ke root atau pengguna yang sesuai.sumber
2>&1
: stackoverflow.com/questions/818255/in-the-bash-shell-what-is-21stderr
danstdout
dalam log,2>&1
harus datang setelah tipuan:myjob.sh >> /var/log/myjob.log 2>&1
YYYY-MM-DD_hh-mm-sec
ke dalam nama file output, sehingga setiap nama file berbeda dan disimpan tanpa menulis ulang?date +\%Y\%m\%d\%H\%M\%S
-cron.log 2> & 1Secara default cron log ke / var / log / syslog sehingga Anda dapat melihat entri terkait cron dengan menggunakan:
/ubuntu/56683/where-is-the-cron-crontab-log
sumber
journalctl | grep cron
pada sistem systemd/var/log/cron
pada AWS Linux AMI.sudo journalctl -u cron
cron
sedang dicatat sangat tergantung pada sistem. Ada jawaban terpisah dengan perincian tentang bagaimana berbagai tujuan logging dikonfigurasikan pada sistem Linux (atau lebih tepatnya, sistem yang menggunakansyslog
). Sistem lain mungkin memiliki cara berbeda untuk mengonfigurasi hal-hal ini.Ini kode saya:
sumber
>>
menambahkan dan2>&1
mengatakan untuk mengirim kesalahan standar ke tempat yang sama dengan output standar.Setidaknya ada tiga jenis penebangan:
Penebangan SEBELUM program dijalankan, yang hanya mencatat JIKA cronjob mencoba untuk menjalankan perintah. Yang itu terletak di / var / log / syslog, seperti yang telah disebutkan oleh @Matthew Lock.
Pencatatan kesalahan SETELAH program mencoba dijalankan, yang dapat dikirim ke email atau ke file, sebagaimana disebutkan oleh @Spliffster. Saya lebih suka masuk ke file, karena dengan email MAKA Anda memiliki sumber masalah BARU, dan memeriksa apakah pengiriman dan penerimaan email berfungsi dengan baik. Terkadang, terkadang tidak. Misalnya, di mesin desktop umum yang sederhana di mana Anda tidak tertarik mengonfigurasi smtp, kadang-kadang Anda lebih suka masuk ke file:
Ada beberapa sumber umum masalah dengan cronjobs: * PATH MUTLAK dari biner yang akan dieksekusi. Ketika Anda menjalankannya dari shell Anda, itu mungkin berhasil, tetapi proses cron tampaknya menggunakan lingkungan lain, dan karenanya ia tidak selalu menemukan biner jika Anda tidak menggunakan path absolut. * PERPUSTAKAAN digunakan oleh biner. Ini kurang lebih sama dengan poin sebelumnya, tetapi pastikan bahwa, jika hanya meletakkan NAMA dari perintah, merujuk tepat ke biner yang menggunakan perpustakaan yang sama, atau lebih baik, periksa apakah biner yang Anda referensikan dengan path absolut sama dengan yang Anda referensikan ketika Anda menggunakan konsol secara langsung. Binari dapat ditemukan menggunakan perintah loc, misalnya:
Pastikan biner yang akan Anda referensikan, sama dengan biner yang Anda panggil di shell Anda, atau cukup uji lagi di shell Anda menggunakan jalur absolut yang Anda rencanakan untuk dimasukkan ke dalam cronjob.
sumber
Di Ubuntu Anda dapat mengaktifkan
cron.log
file hanya berisi entri CRON.Tanda komentar pada baris yang menyebutkan
cron
di/etc/rsyslog.d/50-default.conf
berkas:Simpan dan tutup file dan kemudian restart
rsyslog
layanan:Anda sekarang dapat melihat entri log cron dalam file sendiri:
Output sampel:
Namun, Anda tidak akan melihat informasi lebih lanjut tentang skrip apa yang sebenarnya dijalankan di dalam
/etc/cron.daily
atau/etc/cron.hourly
, kecuali skrip-skrip tersebut langsung menghasilkan ke cron.log (atau mungkin ke beberapa file log lainnya).Jika Anda ingin memverifikasi apakah crontab sedang berjalan dan tidak harus mencarinya di
cron.log
atausyslog
, buat crontab yang mengalihkan keluaran ke file log pilihan Anda - sesuatu seperti:Langkah-langkah yang diambil dari: https://www.cyberciti.biz/faq/howto-create-cron-log-file-to-log-crontab-logs-in-ubuntu-linux/
sumber
cron
sudah mengirimkan keluaran standar dan kesalahan standar setiap pekerjaan yang dijalankan melalui pos ke pemilik pekerjaan cron.Anda dapat menggunakan
MAILTO=recipient
dalamcrontab
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
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,
Beberapa platform (dan mis. GNU Awk) memungkinkan Anda untuk menggunakan nama file
/dev/stderr
untuk pesan kesalahan, tetapi ini tidak portabel; di Perl,warn
dandie
cetak ke kesalahan standar; dengan Python, tulis kesys.stderr
, atau gunakanlogging
; di Ruby, coba$stderr.puts
. Perhatikan juga bagaimana pesan kesalahan harus menyertakan nama skrip yang menghasilkan pesan diagnostik.sumber
Jika Anda menjalankan beberapa perintah dengan sudo, itu tidak akan mengizinkannya. Sudo membutuhkan tty.
sumber
sudo
konfigurasi. Hal-hal yang perlu dijalankan tanpa cara untuk menyediakan kata sandi harus dikonfigurasikan dengan konfigurasiNOPASSWD:
Andasudoers
.Ketika Anda menentukan email yang valid, Anda akan menerima output dari pekerjaan cron yang dieksekusi. Dengan demikian Anda akan dapat memeriksanya dan memastikan semuanya telah dijalankan dengan benar. Perhatikan bahwa Anda tidak akan menerima email jika tidak ada output dari perintah tugas cron.
Harap diingat bahwa Anda akan menerima email untuk setiap pekerjaan cron yang dijalankan. Ini dapat membanjiri kotak masuk Anda jika crons Anda berjalan terlalu sering
sumber