Periksa apakah program yang Anda jalankan dengan cron memiliki file log sendiri. Jika jika mereka tidak menuliskan output mereka ke output standar, Anda dapat mengarahkan ini ke file atau mengirimkannya kepada Anda. Di dalam crontab, pengalihan shell standar berfungsi.
Misalnya untuk mengarahkan output kesalahan some_job.shke some_job.errdan membuang output standar (yaitu mengirimnya ke /dev/null) tambahkan pengalihan berikut ke crontab Anda
Inilah bagaimana saya selalu memecahkan masalah cron saya.
physicsmichael
Apakah contoh kedua itu benar? Bukankah itu akan mengarahkan semuanya kembali /dev/null?
Timmmm
7
@ Timmmm: Saya berhasil. Pertama-tama, pengalihan segalanya dari some_job.shstdout ke /dev/nulldan hanya setelah stderr ke stdout (yang sekarang tidak mengandung apa-apa lagi). Dengan begitu hanya stderrnya yang berakhir di stdout dan diteruskan ke mail.
Benjamin Bannier
9
Kebanyakan daemon cron pada platform tempat saya bekerja secara otomatis mengirim email tentang stdout / stderr pekerjaan cron pengguna ke pengguna yang crontab asalnya berasal. Saya lupa apa yang terjadi pada sistem (pekerjaan cron non-pengguna-spesifik dari / etc / crontab). Masalahnya adalah orang tidak selalu membuat daemon mailer (yaitu, Mail Transfer Agent (MTA) seperti sendmail, qmail, atau postfix) pada sebagian besar OS mirip Unix lagi. Jadi tugas cron email keluaran hanya mati dalam folder email spool lokal suatu tempat jika mereka bahkan mendapatkan yang jauh. Jadi satu jawaban mungkin hanya menjalankan daemon mailer Anda, dan mungkin pastikan Anda memiliki file ~ / .forward untuk meneruskan email lokal Anda ke akun email "asli" Anda.
Jika Anda ingin pekerjaan Anda menulis ke file log tertentu, Anda dapat menggunakan redirection output standar seperti yang disarankan @honk, atau, seandainya pekerjaan cron Anda adalah skrip shell, Anda bisa meminta skrip panggilan logger (1) atau syslog (1) atau apa pun alat baris perintah lainnya yang disediakan OS Anda untuk mengirim pesan sewenang-wenang ke syslog. Kemudian Anda bisa menggunakan metode bawaan OS Anda untuk mengonfigurasi jenis pesan mana yang masuk, mungkin dengan mengedit /etc/syslog.conf.
Sebagian besar pekerjaan cron saya menggunakan skrip bash yang saya tulis khusus untuk tujuan dimulai oleh cron karena alasan tertentu. Pada itu, terutama ketika saya awalnya menulis dan men-debug mereka, saya suka menggunakan "set -vx" bash untuk membuat bentuk yang tidak dikembangkan dan diperluas dari setiap baris skrip shell ditulis ke stdout sebelum dieksekusi. Perhatikan bahwa skrip shell yang dimulai dari cron dianggap non-login, shell tidak interaktif, sehingga skrip startup shell standar Anda seperti .bashrc dan .profile tidak berjalan. Jika Anda menggunakan bash dan ingin bash untuk menjalankan skrip startup, Anda harus mendefinisikan variabel lingkungan "BASH_ENV = / path / ke / my / startup / script" di crontab Anda sebelum baris tempat Anda mendefinisikan pekerjaan.
Ini benar. Seseorang dapat menggunakan mailperintah untuk membaca pesan dari baris perintah. Atau lihat /var/spool/mail. Tetapi jika Anda telah menginstal postfix atau mailer lain dari pada sendmail standar, diperlukan cara lain untuk membaca pesan.
akostadinov
Mengapa kita memerlukan agen layanan surat hanya untuk ini? mail -s "cron output" [email protected]berfungsi dengan baik: /
Martin Konecny
Pada CentOS, output cron saya akan "dikirimkan" ke / var / spool / mail. Lihat dengan menjalankan less $MAILjika Anda ingin melihat output cron untuk pengguna saat ini atau less /var/spool/mail/rootjika Anda ingin melihat output cron untuk perintah yang berjalan sebagai root.
sffc
5
Tugas yang dijalankan cron bertanggung jawab atas pencatatan mereka sendiri.
Cara paling sederhana adalah menangkap kesalahan cetak dan menyimpan kemudian dalam file. Saya memiliki cronjob yang memanggil baris perintah php, seperti ini:
Bagian sebelum '>' ini cronjob saya dan setelah '>' itu adalah menangkap dan menyimpan dalam file yang terletak di folder log di root proyek saya, tetapi bisa di tempat yang Anda inginkan. Waspada: setiap kali cronjob akan dipanggil, dia akan menimpa catatan terakhir. Anda dapat menggunakan '>>' untuk menulis di akhir file yang ada atau mencari perintah terminal 'cat'.
Jika crontab Anda menggunakan 'curl' atau 'wget' dan merujuk ke sebuah tautan, Anda dapat mencari di / var / log / httpd / appName untuk akses-log, jika cron kembali dengan 500 atau 400 pasti ada sesuatu yang salah.
Akhirnya, Anda juga dapat memeriksa / var / log / pesan.
Saya menemukan ini sering menjadi yang paling mudah untuk menghidupkan dan mematikan untuk debugging. Saya biasanya hanya menggunakan nama pengguna @ localhost untuk alamat email.
Jawaban:
Periksa apakah program yang Anda jalankan dengan cron memiliki file log sendiri. Jika jika mereka tidak menuliskan output mereka ke output standar, Anda dapat mengarahkan ini ke file atau mengirimkannya kepada Anda. Di dalam crontab, pengalihan shell standar berfungsi.
Misalnya untuk mengarahkan output kesalahan
some_job.sh
kesome_job.err
dan membuang output standar (yaitu mengirimnya ke/dev/null
) tambahkan pengalihan berikut ke crontab Andaatau mengirimkannya kepada Anda sebagai gantinya (jika
mail
tersedia)sumber
/dev/null
?some_job.sh
stdout ke/dev/null
dan hanya setelah stderr ke stdout (yang sekarang tidak mengandung apa-apa lagi). Dengan begitu hanya stderrnya yang berakhir di stdout dan diteruskan kemail
.Kebanyakan daemon cron pada platform tempat saya bekerja secara otomatis mengirim email tentang stdout / stderr pekerjaan cron pengguna ke pengguna yang crontab asalnya berasal. Saya lupa apa yang terjadi pada sistem (pekerjaan cron non-pengguna-spesifik dari / etc / crontab). Masalahnya adalah orang tidak selalu membuat daemon mailer (yaitu, Mail Transfer Agent (MTA) seperti sendmail, qmail, atau postfix) pada sebagian besar OS mirip Unix lagi. Jadi tugas cron email keluaran hanya mati dalam folder email spool lokal suatu tempat jika mereka bahkan mendapatkan yang jauh. Jadi satu jawaban mungkin hanya menjalankan daemon mailer Anda, dan mungkin pastikan Anda memiliki file ~ / .forward untuk meneruskan email lokal Anda ke akun email "asli" Anda.
Jika Anda ingin pekerjaan Anda menulis ke file log tertentu, Anda dapat menggunakan redirection output standar seperti yang disarankan @honk, atau, seandainya pekerjaan cron Anda adalah skrip shell, Anda bisa meminta skrip panggilan logger (1) atau syslog (1) atau apa pun alat baris perintah lainnya yang disediakan OS Anda untuk mengirim pesan sewenang-wenang ke syslog. Kemudian Anda bisa menggunakan metode bawaan OS Anda untuk mengonfigurasi jenis pesan mana yang masuk, mungkin dengan mengedit /etc/syslog.conf.
Sebagian besar pekerjaan cron saya menggunakan skrip bash yang saya tulis khusus untuk tujuan dimulai oleh cron karena alasan tertentu. Pada itu, terutama ketika saya awalnya menulis dan men-debug mereka, saya suka menggunakan "set -vx" bash untuk membuat bentuk yang tidak dikembangkan dan diperluas dari setiap baris skrip shell ditulis ke stdout sebelum dieksekusi. Perhatikan bahwa skrip shell yang dimulai dari cron dianggap non-login, shell tidak interaktif, sehingga skrip startup shell standar Anda seperti .bashrc dan .profile tidak berjalan. Jika Anda menggunakan bash dan ingin bash untuk menjalankan skrip startup, Anda harus mendefinisikan variabel lingkungan "BASH_ENV = / path / ke / my / startup / script" di crontab Anda sebelum baris tempat Anda mendefinisikan pekerjaan.
sumber
mail
perintah untuk membaca pesan dari baris perintah. Atau lihat/var/spool/mail
. Tetapi jika Anda telah menginstal postfix atau mailer lain dari pada sendmail standar, diperlukan cara lain untuk membaca pesan.mail -s "cron output" [email protected]
berfungsi dengan baik: /less $MAIL
jika Anda ingin melihat output cron untuk pengguna saat ini atauless /var/spool/mail/root
jika Anda ingin melihat output cron untuk perintah yang berjalan sebagai root.Tugas yang dijalankan cron bertanggung jawab atas pencatatan mereka sendiri.
sumber
Cara paling sederhana adalah menangkap kesalahan cetak dan menyimpan kemudian dalam file. Saya memiliki cronjob yang memanggil baris perintah php, seperti ini:
1 0 * * * php /pathOfMyApp/index.php controllerName functionName> / pathOfMyApp / log / myErrorLog 2> & 1
Bagian sebelum '>' ini cronjob saya dan setelah '>' itu adalah menangkap dan menyimpan dalam file yang terletak di folder log di root proyek saya, tetapi bisa di tempat yang Anda inginkan. Waspada: setiap kali cronjob akan dipanggil, dia akan menimpa catatan terakhir. Anda dapat menggunakan '>>' untuk menulis di akhir file yang ada atau mencari perintah terminal 'cat'.
Jika crontab Anda menggunakan 'curl' atau 'wget' dan merujuk ke sebuah tautan, Anda dapat mencari di / var / log / httpd / appName untuk akses-log, jika cron kembali dengan 500 atau 400 pasti ada sesuatu yang salah.
Akhirnya, Anda juga dapat memeriksa / var / log / pesan.
sumber
Saya pikir pengalihan dalam file-cron mungkin bukan pilihan terbaik dalam kasus ini.
Seringkali Anda ingin log pendataan ditempatkan bersama dengan skrip pekerjaan cron. Dalam hal ini, saya sarankan yang berikut:
Ini menambahkan output dari pekerjaan cron ke file capture-log.txt.
sumber
Saya lebih suka mendapatkan laporan email tentang pekerjaan cron. Taruh saja
[email protected]
ke crontab dan Anda akan mendapatkan email. Tentu saja Anda harus mengonfigurasi e-mail untuk akun Anda.
sumber