Bagaimana cara saya membungkam cronjob sepenuhnya ke / dev / null /?

72

Di Ubuntu-Desktop dan di server-debian, saya memiliki skrip yang perlu dijalankan setiap menit (skrip yang memanggil menit-menit ruang browser online saya ).

Masalahnya adalah bahwa pada debian derivate cron melakukan logging ke /var/log/syslogsetiap kali dijalankan. Saya akhirnya melihat mengulangi pesan itu dieksekusi berulang-ulang di /var/log/syslog:

Nov 11 16:50:01 eclabs /USR/SBIN/CRON[31636]: (root) CMD (/usr/bin/w3m -no-cookie http://www.spacetrace.org/secret_script.php > /dev/null 2>&1)

Saya tahu bahwa untuk menekan output dari suatu program saya dapat mengarahkan kembali ke /dev/null, misalnya untuk menyembunyikan semua pesan kesalahan dan peringatan dari suatu program saya dapat membuat baris di crontab seperti ini

* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null

Tapi saya ingin menjalankan cronjob dan memastikan bahwa semua output atau kesalahan yang dihasilkan disalurkan ke NULL, sehingga tidak menghasilkan pesan apa pun di syslog dan tidak menghasilkan email apa pun


EDIT:
ada solusi untuk mengarahkan ulang cron-log ke dalam log terpisah seperti yang diusulkan di sini dengan mengubah/etc/syslog.conf

Tetapi kekurangannya adalah, maka SEMUA output dari semua cronjobs diarahkan.

Dapatkah saya entah bagaimana hanya mengarahkan cronjob tunggal ke file log yang terpisah? Lebih disukai dapat dikonfigurasi di dalam cron.hourlyfile itu sendiri.

rubo77
sumber
2
Anda juga bisa meletakkannya MAILTO=""di awal file cron. Ini akan menekan semua email. Dan saya belum pernah mendengar tentang daemon cron yang mengirimkan output pekerjaan ke syslog (tapi saya rasa itu mungkin).
Patrick
@ Patrick - itu akan menonaktifkan semuanya, yang mungkin OK, tetapi hanya perlu diperhatikan. Lihat pembaruan saya, Anda dapat mengatur beberapa mAILTO.
slm
Ya, MAILTO=""karena baris pertama crontab akan mencegah email apa pun. Juga, gunakan trifecta penuh pada baris perintah Anda jika Anda menekan semua output .. Semua 3 jenis diarahkan oleh string ini: >/dev/null 2>&1 - Tentu saja, Anda dapat memiliki skrip termasuk menulis berkala ke log terpisah.
SDsolar

Jawaban:

119

Buat garis ini:

* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null 2>&1

Ini akan menangkap STDOUT (1) dan STDERR (2) dan mengirimkannya ke /dev/null.

MAILTO

Anda juga dapat menonaktifkan email dengan mengatur dan kemudian mengatur ulang MAILTO=""yang akan menonaktifkan pengiriman email apa pun.

Contoh

MAILTO=""
* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null 2>&1

MAILTO="[email protected]"
 * * * * *      root    /usr/local/sbin/myothercommand.sh

Olahpesan tambahan

Sering kali Anda menerima jenis-jenis pesan berikut /var/log/syslog:

Nov 11 08:17:01 manny CRON[28381]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

Ini hanya pemberitahuan melalui cron bahwa direktori cronjobs dieksekusi. Pesan ini tidak ada hubungannya langsung dengan pekerjaan-pekerjaan ini, melainkan langsung datang dari cronddaemon. Sebenarnya tidak ada yang dapat Anda lakukan tentang ini, dan saya mendorong Anda untuk tidak menonaktifkan ini, karena mereka kemungkinan satu-satunya jendela yang Anda miliki tentang crondjalannya melalui log.

Jika mereka sangat mengganggu Anda, Anda selalu dapat mengarahkan mereka ke file log alternatif untuk mengeluarkannya dari /var/log/syslogfile Anda , melalui /etc/syslog.conffile konfigurasi untuk syslog.

slm
sumber
@ rubo77 - dapatkah Anda menunjukkan contoh? Saya perlu melihat apa yang tidak berhasil dengan ini. Googling menjawab ini sebagai jawabannya: cyberciti.biz/faq/disable-the-mail-alert-by-crontab-command
slm
Ini berfungsi untuk semua keluaran dan email, tetapi masih menghasilkan satu baris untuk setiap panggilan-cron di / var / log / syslog
rubo77
@ rubo77 - itulah yang saya pikir Anda mungkin tanyakan. Anda tidak dapat menghentikan pesan-pesan itu, mereka dihasilkan oleh daemon crond itu sendiri.
slm
@ rubo77 - Saya sadar akan perubahan /etc/syslog.conf, saya tidak akan menganggap ini sebagai alternatif. Itu hanya akan mengubah file tempat log-log itu dibuang atau Anda dapat sepenuhnya menonaktifkan semua pesan cron. Tidak ada cara untuk melakukan apa yang Anda inginkan.
slm
1
@ rubo77 - satu-satunya cara Anda akan dapat melakukan apa yang Anda inginkan adalah jika Anda meletakkan grep -v ...setelah memohon crond.
slm
10

memiliki skrip yang perlu dijalankan setiap menit. Masalahnya adalah bahwa cron masuk ke / var / log / syslog setiap kali dijalankan. Saya akhirnya melihat diulang pesan itu diulangi berulang kali di / var / log / syslog

Karena tidak ada yang Anda lakukan yang menghentikan ini, ada baiknya bertanya: apa sebenarnya skrip ini dan apa sebenarnya pesan yang Anda lihat di syslog?

Jika saran slm tidak berfungsi, ini karena ada sesuatu yang masuk ke syslog secara langsung - baik cron, seperti yang tersirat dalam beberapa komentar Anda, atau proses dijalankan oleh cron. Pesan yang dikirim ke syslog tidak berasal dari stdin atau stderr, jadi 2>&1&>tidak akan membantu.

Mungkin ada cara untuk mengkonfigurasi perilaku aplikasi yang dimaksud, kecuali kita tidak tahu apa itu aplikasi.

Tentunya ada cara untuk mengkonfigurasi sebagian besar implementasi syslog kontemporer (ada beberapa) untuk memfilter pesan dengan sangat spesifik. Misalnya, jika ada tag unik yang digunakan dalam pesan log, Anda dapat menargetkan itu. Tetapi sekali lagi, karena kita tidak tahu apa-apa tentang pesan tertentu, atau syslogd yang Anda gunakan, maka tidak ada yang spesifik yang dapat direkomendasikan.

Poin umum saya adalah jika Anda tidak ingin mengarahkan / memfilter pesan karena "ini akan mengarahkan ulang semua pesan", maka Anda dapat memperbaiki teknik penyaringan. Utas kesalahan server yang Anda tautkan hanya menyebutkan pemfilteran menurut fasilitas ( *.cron) - tetapi Anda dapat mengonfigurasi lebih banyak filter khusus dari itu.


Debian dan Ubuntu keduanya memiliki rsyslog . Pada debian 5+ itu adalah syslog default, di ubuntu itu adalah opsi, jadi Anda harus menginstalnya. Untuk membuat filter yang menargetkan beberapa jenis konten tertentu, letakkan ini di dekat bagian atas (yaitu, sebelum aturan lain, tetapi setelah konfigurasi umum, pemuatan modul, dll) dari /etc/rsyslog.conf. Cara terbaik untuk melakukan ini bukan mengedit rsyslog.confsendiri, tetapi untuk membuat file dalam /etc/rsyslog.conf.d/direktori, dengan nama dimulai dengan dua digit yang kurang dari 50, yaitu /etc/rsyslog.conf.d/15-my-filter.conf. Anda dapat meletakkannya di sana seperti ini:

:msg, contains, "/usr/bin/w3m -no-cookie" /dev/null

Ini akan mengirim pesan ke /dev/null(atau log terpisah jika Anda mau). Namun, pesan masih akan diteruskan melalui aturan selanjutnya yang mengirimkannya /var/log/syslog. Untuk mencegah itu:

& stop

Segera setelah garis lainnya. Ini membuang semua yang cocok dengan aturan sebelumnya. Atau, untuk aturan garis tunggal, Anda bisa menambahkan stopke akhir garis aturan itu.

Anda harus memulai ulang rsyslogdsetelah mengubah konfigurasi, (misalnya pada sistem systemd systemctl restart rsyslog):

kill -HUP $(cat /var/run/rsyslogd.pid)

HUP menyebabkan daemon untuk restart sendiri.

goldilocks
sumber
Untuk rsyslog ~sekarang sudah usang dan harus diganti oleh stop. Juga posisi dalam rsyslogd.conffile penting. Jadi untuk rsyslog saya hanya akan menggunakan :msg, contains, "/usr/bin/w3m -no-cookie" stop. Dan kemudian restart sudo systemctl restart rsyslog.
Frank Breitling
4

Perubahan /etc/default/cron

# Or, to log standard messages, plus jobs with exit status != 0:
# EXTRA_OPTS='-L 5'
#
# For quick reference, the currently available log levels are:
#   0   no logging (errors are logged regardless)
#   1   log start of jobs
#   2   log end of jobs
#   4   log jobs with exit status != 0
#   8   log the process identifier of child process (in all logs)
#
EXTRA_OPTS="-L 0"

Secara default EXTRA_OPTSsalurannya adalah""

Dallas
sumber
2

Redirect untuk /dev/nullmenyembunyikan output dari perintah. Jika Anda tidak melakukan ini maka cron mengirimkan hasilnya kepada Anda. Output dari perintah tidak pernah berakhir di log sistem (setidaknya tidak oleh cron yang melakukan).

Biasanya merupakan ide yang buruk untuk mengarahkan kembali output /dev/null, terutama output kesalahan: jika terjadi kesalahan, Anda tidak akan memiliki informasi untuk mendiagnosis masalah. Jika Anda tidak ingin menerima email, arahkan ke file log.

Namun semua ini tidak relevan dengan masalah Anda. Pesan yang Anda kutip adalah dari cron itu sendiri. Cron menulis entri log setiap kali menjalankan pekerjaan. Tidak ada implementasi cron yang saya lihat memungkinkan Anda untuk menggunakan konfigurasi logging yang berbeda untuk pekerjaan yang berbeda.

Jika Anda ingin menghilangkan beberapa pekerjaan, satu-satunya pilihan Anda adalah menerapkan pemfilteran teks ke pesan log di daemon syslog. Standar de facto untuk pemfilteran syslog adalah menjalankan rsyslog (yang mungkin atau mungkin bukan default pada sistem Anda) sebagai daemon syslog. Lihat jawaban goldilocks untuk cara memfilter perintah khusus ini.

Gilles 'SANGAT berhenti menjadi jahat'
sumber