Bagaimana cara log cron jobs?

218

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.

Adrian M.
sumber
Lihatlah posting ini: Mengelola file log yang dibuat oleh cron jobs .
codeforester

Jawaban:

347
* * * * * myjob.sh >> /var/log/myjob.log 2>&1

akan mencatat semua output dari pekerjaan cron ke /var/log/myjob.log

Anda mungkin menggunakan mailuntuk mengirim email. Sebagian besar sistem akan mengirimkan cronhasil pekerjaan yang tidak ditangani melalui email ke root atau pengguna yang sesuai.

Spliffster
sumber
78
Deskripsi apa artinya 2>&1: stackoverflow.com/questions/818255/in-the-bash-shell-what-is-21
Yamaneko
5
apa yang bisa menjadi masalah jika logfile ini tidak pernah dibuat?
jepit
10
FWIW, Jika Anda ingin keduanya stderrdan stdoutdalam log, 2>&1harus datang setelah tipuan:myjob.sh >> /var/log/myjob.log 2>&1
Dan Lecocq
2
Bagaimana cara memasukkan YYYY-MM-DD_hh-mm-secke dalam nama file output, sehingga setiap nama file berbeda dan disimpan tanpa menulis ulang?
Danijel
6
@Danijel serverfault.com/a/117365/193377 0 0 * * * /some/path/to/a/file.php> $ HOME / date +\%Y\%m\%d\%H\%M\%S-cron.log 2> & 1
AnneTheAgile
61

Secara default cron log ke / var / log / syslog sehingga Anda dapat melihat entri terkait cron dengan menggunakan:

grep CRON /var/log/syslog

/ubuntu/56683/where-is-the-cron-crontab-log

Matthew Lock
sumber
2
Di ubuntu 12.04, standarnya adalah tanpa .log, yaitu / var / log / syslog
tishma
5
gunakan journalctl | grep cronpada sistem systemd
Microsoft Linux TM
2
/var/log/cronpada AWS Linux AMI.
Jonathan
2
atausudo journalctl -u cron
Gianfranco P.
2
Di mana tepatnya cronsedang dicatat sangat tergantung pada sistem. Ada jawaban terpisah dengan perincian tentang bagaimana berbagai tujuan logging dikonfigurasikan pada sistem Linux (atau lebih tepatnya, sistem yang menggunakan syslog). Sistem lain mungkin memiliki cara berbeda untuk mengonfigurasi hal-hal ini.
tripleee
10

Ini kode saya:

* * * * * your_script_fullpath >> your_log_path 2>&1
Haimei
sumber
">>" berarti menambahkan data ke fileright? apa arti dari "2> & 1", output penuh dengan kesalahan, bukan?
Nullpointer
3
Pertanyaan redirection dasar paling baik dicek di manual. Ada juga metrik potrzebie pertanyaan duplikat tentang operator ini di Stack Overflow. Tapi ya, kira-kira; >>menambahkan dan 2>&1mengatakan untuk mengirim kesalahan standar ke tempat yang sama dengan output standar.
tripleee
10

Setidaknya ada tiga jenis penebangan:

  1. 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.

  2. 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:

     * * * *  COMMAND_ABSOLUTE_PATH > /ABSOLUTE_PATH_TO_LOG 2>&1
    
    • Saya juga akan mempertimbangkan memeriksa izin / ABSOLUTE_PATH_TO_LOG, dan menjalankan perintah dari izin pengguna itu. Hanya untuk verifikasi, saat Anda menguji apakah itu bisa menjadi sumber masalah potensial.
  3. Pencatatan program itu sendiri, dengan penanganan kesalahan dan pencatatan sendiri untuk tujuan pelacakan.

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:

$locate python

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 masalah umum lainnya adalah sintaksis dalam cronjob. Ingatlah bahwa ada karakter khusus yang dapat Anda gunakan untuk daftar (koma), untuk menentukan rentang (tanda hubung -), untuk menentukan kenaikan rentang (garis miring), dll. Lihatlah: http://www.softpanorama.org/Utilities/ cron.shtml
David L.
sumber
8

Di Ubuntu Anda dapat mengaktifkan cron.logfile hanya berisi entri CRON.

Tanda komentar pada baris yang menyebutkan crondi /etc/rsyslog.d/50-default.confberkas:

#  Default rules for rsyslog.
#

#                       For more information see rsyslog.conf(5) and /etc/rsyslog.conf

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                          /var/log/cron.log

Simpan dan tutup file dan kemudian restart rsysloglayanan:

sudo systemctl restart rsyslog

Anda sekarang dapat melihat entri log cron dalam file sendiri:

sudo tail -f /var/log/cron.log

Output sampel:

Jul 18 07:05:01 machine-host-name CRON[13638]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)

Namun, Anda tidak akan melihat informasi lebih lanjut tentang skrip apa yang sebenarnya dijalankan di dalam /etc/cron.dailyatau /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.logatau syslog, buat crontab yang mengalihkan keluaran ke file log pilihan Anda - sesuatu seperti:

# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log 2>&1

Langkah-langkah yang diambil dari: https://www.cyberciti.biz/faq/howto-create-cron-log-file-to-log-crontab-logs-in-ubuntu-linux/

Gianfranco P.
sumber
Ubuntu 16.04 tidak menunjukkan cron log dan informasi ini berhasil.
pojda
5

cron sudah mengirimkan keluaran standar dan kesalahan standar setiap pekerjaan yang dijalankan melalui pos ke pemilik pekerjaan cron.

Anda dapat menggunakan MAILTO=recipientdalam crontabfile 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>&1mengatakan "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.)

cronpekerjaan 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/stderruntuk pesan kesalahan, tetapi ini tidak portabel; di Perl, warndan diecetak 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.

tripleee
sumber
1

Jika Anda menjalankan beberapa perintah dengan sudo, itu tidak akan mengizinkannya. Sudo membutuhkan tty.

Saad Masood
sumber
4
Ini juga tergantung pada sudokonfigurasi. Hal-hal yang perlu dijalankan tanpa cara untuk menyediakan kata sandi harus dikonfigurasikan dengan konfigurasi NOPASSWD:Anda sudoers.
tripleee
0

Jika Anda masih ingin memeriksa pekerjaan cron Anda, Anda harus memberikan akun email yang valid saat mengatur pekerjaan Cron di cPanel.

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

Faridul Khan
sumber