Di mana kesalahan cron dicatat?

170

Jika saya cronsalah mengatur pekerjaan, tampaknya gagal. Di mana saya harus mencari log kesalahan untuk memahami apa yang salah?

Brian Lyttle
sumber

Jawaban:

106

Seperti yang telah ditunjukkan orang lain, cronakan mengirimi Anda output dari program apa pun yang dijalankannya (jika ada output). Jadi, jika Anda tidak mendapatkan output apa pun, pada dasarnya ada tiga kemungkinan:

  1. crond bahkan tidak dapat memulai shell untuk menjalankan program atau mengirim email
  2. crond memiliki masalah mengirim output, atau email hilang.
  3. program tidak menghasilkan keluaran apa pun (termasuk pesan kesalahan)

Kasus 1. sangat tidak mungkin, tetapi sesuatu harus ditulis dalam log cron. Cron memiliki fasilitas syslog milik sendiri, jadi Anda harus melihat /etc/syslog.conf(atau file yang setara di distro Anda) untuk melihat di mana pesan-pesan fasilitas crondikirim. Tujuan populer termasuk /var/log/cron, /var/log/messagesdan /var/log/syslog.

Dalam kasus 2., Anda harus memeriksa log daemon mailer: pesan dari daemon Cron biasanya muncul dari root@yourhost. Anda dapat menggunakan MAILTO=...baris dalam file crontab untuk meminta cron mengirim email ke alamat tertentu, yang seharusnya memudahkan untuk melihat log daemon mailer. Misalnya:

[email protected]
00 15 * * *  echo "Just testing if crond sends email"

Dalam kasus 3., Anda dapat menguji apakah program itu benar-benar dijalankan dengan menambahkan perintah lain yang efeknya dapat Anda periksa dengan mudah: misalnya,

00 15 * * * /a/command; touch /tmp/a_command_has_run

sehingga Anda dapat memeriksa apakah crondtelah benar-benar menjalankan sesuatu dengan melihat waktu /tmp/a_command_has_run.

Riccardo Murri
sumber
3
Apakah "email" ini masuk file juga? Saya menggunakan web hosting bersama dan tidak berpikir mereka tahu di mana saya harus mengirim email.
Nathan Long
3
Saya menghargai saran dalam kasus 3 untuk memeriksa apakah perintahnya bahkan berjalan. Dalam kasus saya, cron tidak menjalankan pekerjaan saya karena saya baru saja mengubah zona waktu server dan perlu me-restart server cron sehingga akan mengevaluasi waktu cron di zona waktu yang tepat.
Nathan
1
Bergantung pada agen transfer surat Anda, Anda juga dapat menemukan email yang tidak terkirim dalam file yang disebut dead.letterdi root atau direktori home pengguna masing-masing.
Dario Seidl
43

Anda selalu dapat secara eksplisit mengirim output pekerjaan ke file log:

0 8 * * * /usr/local/bin/myjob > /var/log/myjob.log 2>&1

Ingatlah bahwa ini akan menggantikan perilaku email yang telah disebutkan sebelumnya, karena crond sendiri tidak akan menerima output apa pun dari pekerjaan tersebut. Jika Anda ingin mempertahankan perilaku itu, Anda harus melihat ke tee (1).

kepala kode
sumber
9
Mengapa tidak menggunakan >>alih-alih >, jadi Anda tidak menimpa file log setiap saat?
Chris
Tentu! Setiap pengalihan I / O akan dilakukan, bahkan | /usr/bin/loggerjika Anda mau, seperti yang disarankan oleh Stefan. Pilih racun Anda: tldp.org/LDP/abs/html/io-redirection.html
codehead
cron membuat file log ini myjob.logdengan ukuran 0 seperti yang diharapkan, tetapi log ke file lain, di mana saya bisa mengubah pengaturan ini?
Akuntan م
42

Jika Anda tidak melihat surel, Anda mungkin melakukan spamming root @ perusahaan Anda dengan kesalahan yang bisa sangat mengganggu orang-orang yang menggunakan akun itu untuk memantau. Coba kirim hasilnya ke Syslog:

*/5 * * * * yourcronjob 2>&1 | /usr/bin/logger -t yourtag

Kemudian, tunggu cronjob dijalankan dan cari kesalahan di / var / log / messages (atau /var/log/user.log pada beberapa sistem).

Ini berfungsi baik untuk pesan kesalahan yang panjangnya hanya 1-2 baris, seperti "yourcronjob: command not found". Itu juga memanfaatkan infrastruktur syslog Anda yang ada (Logrotation, syslogging pusat, Splunk, dll.) Ini juga mengurangi spam email untuk di-root.

Ini mungkin bukan solusi yang baik jika cronjob Anda menghasilkan ratusan baris output.

Stefan Lasiewski
sumber
8

Konfigurasi cron default akan mengirimi Anda email dengan hasil program Anda. Jika ini gagal, Anda bisa mencoba membungkus program Anda yang gagal dalam skrip shell yang memastikan bahwa program tersebut tidak gagal, dan Anda bisa mencatat hasilnya lebih lanjut.

Ini adalah pengaturan yang dapat dikonfigurasi pada beberapa implementasi cron.

miguel.de.icaza
sumber
7

Anda harus mendapatkan email dari crondsaat pekerjaan gagal dijalankan atau ketika pekerjaan mengembalikan kode keluar yang tidak nol. Coba ketikkan:

$ mailx

di command prompt.

mailx(1)adalah program membaca surat dasar pada hampir semua sistem Unixlike. Ini sangat primitif menurut standar modern, tetapi Anda dapat mengandalkannya untuk selalu tersedia. Lainnya, agen surat yang lebih baik mungkin tersedia, tetapi ada cukup banyak dari mereka yang Anda tidak pernah tahu yang diinstal pada beberapa mesin acak yang kebetulan Anda gunakan.

Perhatikan bahwa kecuali Anda telah mengonfigurasi sistem Anda sebagai server email Internet, subsistem email ini hanya digunakan di dalam mesin. Anda dapat mengirim email ke dan menerima dari pengguna lain di mesin, tetapi Anda mungkin tidak dapat mengirim email ke dunia, dan email dari dunia luar tentu tidak akan bisa datang ke mesin Anda.

Warren Young
sumber
5

Cron mencatat info dasar /var/log/messages, tetapi mengirimkan output program apa pun kepada pengguna yang meminta.

Hemant
sumber
Tidak ada /var/log/messagesdi server Ubuntu saya ( 4.4.0-128-generic #154-Ubuntu SMP). Ada yang tahu kenapa? I'va memiliki beberapa tugas cron yang didefinisikan dalam rootcrontab selama berbulan-bulan (misalnya apt autoremove), tetapi tidak ada yang dieksekusi.
Dan Dascalescu
2

Saya menemukan thread ini beberapa tahun yang lalu mengalami masalah yang sama dan baru-baru ini menemukan solusi untuk kasus yang disebutkan di atas oleh Ricardo. Kurangnya email sulit dideteksi (seperti yang Anda sebutkan) dan Anda tentu tidak ingin mengirim spam ke email perusahaan Anda. Jika tertarik lihat deadmanssnitch.com. . Alat ini tampaknya bisa menyelesaikan kasus-kasus tersebut. Tampaknya cukup mudah digunakan — cukup tambahkan sedikit kode yang diberikan alat ini kepada cronjob Anda. Jika pekerjaan Anda gagal dijalankan pada internal yang ditentukan, Anda akan diberitahu. Jika pekerjaan Anda mulai berjalan lagi, Anda juga akan diperingatkan.

ss_jt
sumber
1

Saya menggunakan vixie-cron, jadi saya tidak tahu apakah ini berlaku untuk semuanya. Tapi saya punya dead.letterfile yang berisi semua hasil pekerjaan.

Di /root/folder saya, saya memiliki crons.cronyang saya tetapkan sebagai crontab saya dengan menjalankan crontab /root/crons.cron. dead.letterakan dibuat /root/juga.

Sunting Saya baru saja Google'd dead.letter, dan ini surat yang tidak terkirim. Tampaknya tidak ada hubungannya dengan cron. Jika Anda tidak mengatur email dengan benar (seperti saya), Anda akan memiliki file tersebut.

jonescb
sumber
0

Untuk pemula, ini bisa menyusahkan untuk debug. Pastikan untuk tidak menukar nilai menit dan jam. Menit datang pertama, lalu jam. Ketika Anda memberikan nilai kurang dari 12 untuk masing-masing, nilai itu akan menerimanya tetapi mungkin tidak berfungsi seperti yang diharapkan atau sama sekali.

Michael Woyo
sumber
2
Anda benar, tetapi saya tidak yakin ini benar-benar menjawab pertanyaan.
roaima