ฉันจะปิดเสียง cronjob ให้เป็น / dev / null / ได้อย่างไร


72

บน Ubuntu-Desktop และบนเดเบียนเซิร์ฟเวอร์ของฉันฉันมีสคริปต์ที่ต้องดำเนินการทุกนาที (สคริปต์ที่เรียกนาทีของการเรียกดูออนไลน์ในพื้นที่ของฉัน)

ปัญหาคือว่าใน debian derivates cron จะเข้าสู่ระบบ/var/log/syslogทุกครั้งที่ดำเนินการ ฉันเห็นข้อความที่ถูกประหารซ้ำแล้วซ้ำอีกใน/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)

ฉันรู้ว่าเพื่อที่จะระงับการส่งออกของโปรแกรมฉันสามารถเปลี่ยนเส้นทางไปยัง/dev/nullเช่นซ่อนข้อผิดพลาดและข้อความเตือนจากโปรแกรมฉันสามารถสร้างบรรทัดใน crontab เช่นนี้

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

แต่ฉันต้องการเรียกใช้ cronjob และตรวจสอบว่าเอาต์พุตหรือข้อผิดพลาดที่สร้างขึ้นทั้งหมดถูกไพพ์ไปที่ NULL ดังนั้นจึงไม่สร้างข้อความใด ๆ ใน syslog และไม่สร้างอีเมลใด ๆ


แก้ไข:
มีวิธีแก้ปัญหาในการเปลี่ยนเส้นทางบันทึก cron เป็นบันทึกแยกต่างหากเช่นเสนอที่นี่โดยการเปลี่ยน/etc/syslog.conf

แต่ข้อเสียเปรียบก็คือว่าผลลัพธ์ทั้งหมดของ cronjobs ทั้งหมดจะถูกเปลี่ยนเส้นทาง

ฉันสามารถเปลี่ยนเส้นทาง cronjob เดียวไปยังไฟล์บันทึกแยกต่างหากได้หรือไม่ กำหนดค่าได้ดีกว่าภายในcron.hourlyตัวไฟล์เอง


2
คุณสามารถใส่MAILTO=""ที่จุดเริ่มต้นของไฟล์ cron การดำเนินการนี้จะระงับอีเมลทั้งหมด และฉันไม่เคยได้ยิน cron daemon ที่ส่งงานออกไปยัง syslog (แต่ฉันคิดว่ามันเป็นไปได้)
Patrick

@Patrick - ที่จะปิดการใช้งานทุกอย่างซึ่งอาจจะตกลง แต่เพียงระวัง ดูการอัปเดตของฉันคุณสามารถตั้งค่า mAILTO หลายรายการ
slm

ใช่MAILTO=""เพราะบรรทัดแรกของ crontab จะป้องกันอีเมลใด ๆ นอกจากนี้ให้ใช้ trifecta แบบเต็มบนบรรทัดคำสั่งของคุณหากคุณไม่แสดงผลลัพธ์ทั้งหมด .. สตริงทั้ง 3 ชนิดนี้ถูกเปลี่ยนเส้นทางโดย: >/dev/null 2>&1 - แน่นอนคุณสามารถมี scrip รวมเป็นระยะ ๆ เขียนไปยังบันทึกแยกต่างหาก
SDsolar

คำตอบ:


119

ทำบรรทัดนี้:

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

นี้จะจับภาพทั้ง STDOUT (1) และ STDERR (2) /dev/nullและส่งพวกเขาไป

MAILTO

นอกจากนี้คุณยังสามารถปิดการใช้งานอีเมลโดยการตั้งค่าแล้วรีเซ็ตMAILTO=""ซึ่งจะปิดการใช้งานการส่งอีเมลใด ๆ

ตัวอย่าง

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

MAILTO="admin@somedom.com"
 * * * * *      root    /usr/local/sbin/myothercommand.sh

การส่งข้อความเพิ่มเติม

บ่อยครั้งที่คุณจะได้รับข้อความประเภทต่อไปนี้ใน/var/log/syslog:

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

นี่เป็นเพียงการแจ้งเตือนผ่าน cron ซึ่งมีการประมวลผลไดเรกทอรีของ cronjobs ข้อความนี้ไม่เกี่ยวข้องกับงานเหล่านี้โดยตรง แต่มาจากcronddaemon โดยตรง ไม่มีสิ่งใดที่คุณสามารถทำได้เกี่ยวกับสิ่งเหล่านี้และฉันขอแนะนำให้คุณปิดการใช้งานสิ่งเหล่านี้เนื่องจากเป็นไปได้ว่าเป็นหน้าต่างเดียวที่คุณเข้าสู่พฤติกรรมcrondผ่านบันทึก

หากพวกเขากำลังที่น่ารำคาญมากกับคุณคุณสามารถตรงไปยังแฟ้มบันทึกทางเลือกให้กับพวกเขาได้รับจากคุณ/var/log/syslogไฟล์ผ่านแฟ้มการกำหนดค่าสำหรับ/etc/syslog.confsyslog


@ rubo77 - คุณสามารถแสดงตัวอย่างได้หรือไม่? ฉันต้องการดูว่าอะไรที่ใช้ไม่ได้กับสิ่งนี้ Googling เปลี่ยนสิ่งนี้เป็นคำตอบ: cyberciti.biz/faq/disable-the-mail-alert-by-crontab-command
slm

วิธีนี้ใช้ได้กับเอาต์พุตและอีเมลทั้งหมด แต่ก็ยังสร้างบรรทัดสำหรับการโทร cron แต่ละครั้งใน / var / log / syslog
rubo77

@ rubo77 - นั่นคือสิ่งที่ฉันคิดว่าคุณอาจจะถามเกี่ยวกับ คุณไม่สามารถหยุดข้อความเหล่านั้นได้มันจะสร้างขึ้นโดย crond daemon เอง
slm

@ rubo77 - ฉันตระหนักถึงการเปลี่ยนแปลง/etc/syslog.confฉันจะไม่พิจารณาทางเลือกนี้ ซึ่งจะเปลี่ยนไฟล์ที่บันทึกถูกทิ้งลงในไฟล์หรือคุณสามารถปิดใช้งานข้อความ cron ทั้งหมดพร้อมกันได้ ไม่มีวิธีการทำสิ่งที่คุณต้องการ
slm

1
@ rubo77 - วิธีเดียวที่คุณจะสามารถที่จะทำในสิ่งที่คุณต้องการคือถ้าคุณใส่หลังจากที่กล่าวอ้างของgrep -v ... crond
slm

10

มีสคริปต์ที่จะต้องดำเนินการในแต่ละนาที ปัญหาคือ cron กำลังเข้าสู่ / var / log / syslog ทุกครั้งที่ดำเนินการ ฉันเห็นข้อความซ้ำแล้วซ้ำอีกซึ่งมันถูก ececuted ซ้ำไปซ้ำมาใน / var / log / syslog

ตั้งแต่ไม่มีอะไรที่คุณทำดูเหมือนว่าจะหยุดนี้จะมีมูลค่าถาม: สิ่งที่ว่าเป็นสคริปต์นี้และสิ่งที่ตรงกับข้อความที่คุณเห็นใน syslog?

หากข้อเสนอแนะของ slm ใช้งานไม่ได้อาจเป็นเพราะมีบางสิ่งเข้าสู่ syslog โดยตรง - cron อย่างใดอย่างหนึ่งซึ่งดูเหมือนจะบอกเป็นนัยในความคิดเห็นของคุณหรือกระบวนการอื่นที่ดำเนินการโดย cron ข้อความที่ส่งไปยัง syslog ไม่ได้มาจาก stdin หรือ stderr ดังนั้น2>&1&>จะไม่ช่วย

อาจมีวิธีกำหนดค่าลักษณะการทำงานของแอปพลิเคชันที่เป็นปัญหายกเว้นว่าเราไม่ทราบว่าเป็นอะไร

แน่นอนมีวิธีการกำหนดค่าการใช้งาน syslog ร่วมสมัยมากที่สุด (มีหลาย) เพื่อกรองข้อความโดยเฉพาะอย่างยิ่ง ตัวอย่างเช่นหากมีแท็กเฉพาะที่ใช้ในข้อความบันทึกคุณสามารถกำหนดเป้าหมายได้ แต่อีกครั้งเนื่องจากเราไม่รู้อะไรเกี่ยวกับข้อความนั้นหรือ syslogd ที่คุณใช้ดังนั้นจึงไม่มีอะไรพิเศษที่สามารถแนะนำได้

จุดทั่วไปของฉันคือถ้าคุณไม่ต้องการเปลี่ยนเส้นทาง / กรองข้อความเพราะ "นี่จะเปลี่ยนเส้นทางข้อความทั้งหมด" จากนั้นคุณสามารถปรับแต่งเทคนิคการกรอง เธรดข้อผิดพลาดของเซิร์ฟเวอร์ที่คุณเชื่อมโยงกับเพียงกล่าวถึงการกรองตามส่วนอำนวยความสะดวก ( *.cron) - แต่คุณสามารถกำหนดค่าตัวกรองพิเศษได้มากกว่านั้น


Debian และ Ubuntu ทั้งสองได้rsyslogใช้ได้ บน debian 5+ เป็น syslog เริ่มต้นบน Ubuntu เป็นตัวเลือกดังนั้นคุณจะต้องติดตั้ง สร้างตัวกรองที่มีเป้าหมายชนิดของเนื้อหาที่เฉพาะเจาะจงบางสถานที่แห่งนี้อยู่ใกล้กับด้านบน (กล่าวคือก่อนที่กฎระเบียบอื่น ๆ ใด ๆ แต่หลังจากที่ตั้งค่าทั่วไปโหลดโมดูล ฯลฯ ) /etc/rsyslog.confของ วิธีที่ดีที่สุดที่จะทำเช่นนี้ไม่ได้ที่จะแก้ไขrsyslog.confตัวเอง แต่เพื่อสร้างไฟล์ใน/etc/rsyslog.conf.d/ไดเรกทอรีที่มีชื่อขึ้นต้นด้วยตัวเลขสองหลักที่มีน้อยกว่า 50 /etc/rsyslog.conf.d/15-my-filter.confคือ คุณสามารถใส่สิ่งนี้:

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

นี่จะส่งข้อความไปที่/dev/null(หรือบันทึกแยกต่างหากหากคุณต้องการ) /var/log/syslogแต่ข้อความจะยังคงได้รับผ่านกฎระเบียบที่ตามมาซึ่งส่งไปยัง เพื่อป้องกันไม่ให้:

& stop

ทันทีหลังจากบรรทัดอื่นนั้น สิ่งนี้จะละทิ้งสิ่งที่ตรงกับกฎก่อนหน้านี้ หรือสำหรับกฎบรรทัดเดียวคุณสามารถเพิ่มstopไปที่ท้ายบรรทัดกฎนั้นได้

คุณต้องรีสตาร์ทrsyslogdหลังจากเปลี่ยนการกำหนดค่า (เช่นในระบบ systemd systemctl restart rsyslog):

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

HUP ทำให้ daemon รีสตาร์ทตัวเอง


สำหรับ rsyslog จะเลิกในขณะนี้และควรถูกแทนที่ด้วย~ stopตำแหน่งในrsyslogd.confไฟล์ก็สำคัญเช่นกัน ดังนั้นสำหรับ rsyslog :msg, contains, "/usr/bin/w3m -no-cookie" stopฉันก็จะใช้ sudo systemctl restart rsyslogแล้วรีสตาร์ท
Frank Breitling

4

เปลี่ยนแปลง /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"

โดยค่าเริ่มต้นEXTRA_OPTSสายคือ""


2

การเปลี่ยนเส้นทางเพื่อ/dev/nullซ่อนเอาต์พุตจากคำสั่ง หากคุณไม่ทำเช่นนี้ cron จะส่งเอาต์พุตให้คุณทางไปรษณีย์ เอาต์พุตจากคำสั่งไม่สิ้นสุดลงในบันทึกของระบบ (อย่างน้อยก็ไม่ใช่ด้วยการทำ cron)

มันเป็นความคิดที่ดีที่จะเปลี่ยนเส้นทางไปยังผลลัพธ์/dev/nullโดยเฉพาะอย่างยิ่งข้อผิดพลาด: หากมีสิ่งผิดปกติคุณจะไม่มีข้อมูลใด ๆ ในการวินิจฉัยปัญหา หากคุณไม่ต้องการรับอีเมลให้เปลี่ยนเส้นทางไปยังไฟล์บันทึก

สิ่งนี้ไม่เกี่ยวข้องกับปัญหาของคุณ ข้อความที่คุณอ้างมาจาก cron เอง Cron เขียนรายการบันทึกทุกครั้งที่เรียกใช้งาน ไม่มีการนำ cron ที่ฉันเห็นมาให้คุณใช้การกำหนดค่าการบันทึกที่แตกต่างกันสำหรับงานที่แตกต่างกัน

หากคุณต้องการละเว้นงานบางอย่างตัวเลือกเดียวของคุณคือการใช้การกรองข้อความกับข้อความบันทึกใน syslog daemon มาตรฐานพฤตินัยสำหรับการกรอง syslog คือการเรียกใช้rsyslog (ซึ่งอาจเป็นค่าเริ่มต้นในระบบของคุณ) หรือไม่ในฐานะ syslog daemon ดูคำตอบของ goldilocksสำหรับวิธีกรองคำสั่งเฉพาะนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.