ข้อผิดพลาด“ (CRON) ข้อมูล (ไม่ติดตั้ง MTA ยกเลิกเอาต์พุต)” ใน syslog


198

ฉันติดตั้ง Ubuntu 12.04.1 LTS ใหม่หลายเซิร์ฟเวอร์

ฉันยังไม่ได้เพิ่มงาน cron หรือแก้ไข crontab ของฉันบนเซิร์ฟเวอร์เหล่านั้นอย่างไรก็ตามในเวลาเดียวกันสำหรับแต่ละเครื่องฉันได้รับ CPU 75% และข้อมูลต่อไปนี้ใน syslog ของฉันในช่วงเวลาที่ขัดขวาง:

CRON[8380]: (CRON) info (No MTA installed, discarding output)

ฉันได้ทำการติดตั้งแบบโมโนสมบูรณ์และกำลังใช้งานเว็บเซิร์ฟเวอร์สแต็กบริการ

วิธีที่ดีที่สุดสำหรับฉันที่จะหยุดสิ่งนี้เกิดขึ้นคืออะไร? ฉันต้องการที่จะลบ CPU ขัดขวาง


ทุกวันเวลา 6:25 น. เหล่านี้เป็นสคริปต์จาก /etc/cron.daily/ ฉันพยายามส่งอีเมลเพียงครั้งเดียว: ความนิยม - การประกวด ดูว่าสคริปต์ของคุณและดูว่าสคริปต์ใดพยายามส่งจดหมาย ที่ควรแคบลง จากนั้น 'chmod 0644 /etc/cron.daily/script-name' เพื่อป้องกันการกระทำ

คำตอบ:


173

Linux ใช้เมลเพื่อส่งการแจ้งเตือนไปยังผู้ใช้ ลีนุกซ์ส่วนใหญ่มีบริการอีเมล (รวมถึง MTA) Ubuntu ไม่ได้ทำ

คุณสามารถติดตั้งบริการอีเมลเช่น postfix เพื่อแก้ไขปัญหานี้

sudo apt-get install postfix

หรือคุณไม่สนใจมัน ฉันไม่คิดว่า cron ไม่สามารถส่งข้อความมีอะไรเกี่ยวข้องกับ CPU spike (ที่เชื่อมโยงกับงานพื้นฐานที่ cron กำลังทำงานอยู่) มันอาจจะปลอดภัยที่สุดในการติดตั้ง MTA แล้วอ่านข้อความ ( muttเป็นโปรแกรมอ่านจดหมายระบบที่ดี)


5
postfix เป็นสิ่งที่ดีสำหรับการติดตั้งหรือไม่? MTA ใดที่ใช้ง่ายที่สุด
endolith

2
postfix เป็นเซิร์ฟเวอร์จดหมายที่ใช้กันอย่างแพร่หลายสำหรับ linux, ติดมัน
RápliAndrás

5
เป็นมูลค่าชี้ให้เห็นว่าสำหรับใช้กับ cron (นั่นคือถ้าคุณไม่ต้องการส่งอีเมลออกจริง) ในระหว่างขั้นตอนการติดตั้งคุณควรตอบเพื่อกำหนดค่าสำหรับการใช้งานในท้องถิ่นเท่านั้น
steffen

วิธีเดียวที่ฉันรู้ว่าจะตรวจสอบจดหมายมีmailให้โดยmailutils(เดเบียน) หากมีวิธีที่ดีกว่าในตัว postfix?
ThorSummoner

79

สิ่งนี้เกิดขึ้นเนื่องจากงาน cron ของคุณกำลังสร้างเอาต์พุตจากนั้น cron daemon พยายามส่งอีเมลเอาต์พุตนั้นให้คุณ (เช่น root) หากคุณไม่ต้องการเอาต์พุตนั้นวิธีที่ง่ายที่สุดในการแก้ปัญหานี้ก็คือการทิ้งมันไว้ที่ crontab:

sudo crontab -e

และเพิ่ม>/dev/null 2>&1ในทุกงาน:

* * * * * yourCommand >/dev/null 2>&1

10
ปัญหาของวิธีนี้คือมันไม่ได้อธิบายการใช้งาน CPU สูง Cron พยายามสื่อสารอย่างชัดเจนและนี่เป็นเพียงการเพิกเฉยต่อผลลัพธ์ ฉันมีแนวโน้มที่จะจัดการกับผลลัพธ์มากกว่าทิ้งในกรณีที่มีข้อมูลการดีบักที่เป็นประโยชน์
Oli

1
Oli แม้ว่าจะเป็นคำถามเก่า แต่ฉันก็ประสบปัญหาเดียวกัน แต่อยู่ในราสเบอร์รี่ PI ผมเห็นพวงของNo MTA installed, discarding outputข้อความในบันทึกและโปรแกรมของฉันในที่สุดก็หยุดทำงานได้ด้วยตัวเอง ฉันเชื่อว่าเป็นเพราะ CPU ขัดขวาง ดูเหมือนว่าคำตอบทั้งหมดที่โพสต์สำหรับคำถามนี้ดูเหมือนจะเพิกเฉย
THN

4
เพื่อให้การส่งออกใส่คำสั่งในสคริปต์และ stdout ท่อและ stderr loggerไป ตัวอย่างเช่นyourCommand >/dev/null 2>&1 | logger -t mycmd. สิ่งนี้จะนำเอาต์พุตไปไว้ใน syslog เพื่อการรักษาที่ปลอดภัยและหยุดการร้องเรียน MTA
CivMeierFan

56

ในกรณีของฉันข้อความแจ้งว่ามีปัญหาเรื่องสิทธิ์อนุญาตกับสคริปต์ทุบตี แต่ฉันไม่เห็นจนกว่าจะติดตั้ง MTA

ตามที่แนะนำฉันวิ่ง:

sudo aptitude install postfix

ฉันเลือก "Local" ระหว่างการติดตั้งและหลังจากทำงาน cron อีกครั้ง:

sudo tail -f /var/mail/<user>

ในกรณีของฉันฉันแทนที่

<user>

ด้วย "root"

ฉันสามารถดูข้อผิดพลาดเกี่ยวกับการอนุญาตได้


3
ขอบคุณสำหรับความคิดเห็นเพิ่มเติมเกี่ยวกับวิธีการตรวจสอบกล่องจดหมายเพื่อดูข้อผิดพลาดจากงาน!
Stuart Allen

32

ดังที่ระบุไว้ในคำตอบก่อนหน้านี้เกิดขึ้นเนื่องจากงาน cron ของคุณกำลังสร้างเอาต์พุตและจากนั้น cron daemon พยายามส่งอีเมลเอาต์พุตนั้นถึงคุณ หากคุณไม่ต้องการ (หรือไม่สามารถติดตั้ง MTA ได้) แต่คุณต้องการเห็นผลลัพธ์คุณสามารถเปลี่ยนเส้นทางของงาน cron ไปยังล็อกไฟล์ แก้ไขไฟล์ crontab ของคุณด้วย

crontab -e

(ใช้sudoหากปัญหาเกิดขึ้นกับ crontab ของรูท) และเพิ่ม หลังจากทุกคำสั่งเช่นนี้>> /some/log/file 2>&1

0 3 * * * cmd   >> / some / log / file 2> & 1

หากมีคำสั่งหลายบนเส้นคั่นด้วย;,  &&  หรือ||คุณควรทำข้างต้นสำหรับแต่ละคำสั่งเช่นนี้

0 3 * * * cmd 1   >> / some / log / file 2> & 1;  cmd 2   >> / some / log / file 2> & 1

หรือกลุ่มพวกเขาเช่นนี้

0 3 * * * ( cmd 1 ;   cmd 2 )   >> / some / log / file 2> & 1

หากคุณต้องการละเว้น stdout และดักจับ stderr เท่านั้นให้ใช้แทน ใส่ล็อกไฟล์ทุกที่ที่คุณต้องการ - โฮมไดเร็กตอรี่ของคุณ หรือแม้ว่าคุณจะแน่ใจว่าคุณไม่จำเป็นต้องเก็บมันไว้> /dev/null 2>> /some/log/file/var/log/tmp

จากนั้นดูที่ไฟล์บันทึกหลังจากที่งานรัน


28

ใน crontab ให้เพิ่มนี่เป็นบรรทัดแรก:

MAILTO=""

วิธีนี้จะป้องกันไม่ให้ cron พยายามส่งอีเมล


4
อย่าใส่ความคิดเห็นใด ๆ ( #) หลังจากนั้นมิMAILTO=""ฉะนั้นจะไม่สามารถใช้งานได้
SBF

23

หากคุณไม่ต้องการติดตั้ง MTA (ซึ่งปัจจุบันฉันไม่จำเป็นต้องใช้) คุณสามารถไพพ์ผลลัพธ์ของงาน cron ไปยังล็อกไฟล์

sudo crontab -e

จากนั้นงาน cron ของคุณจะเป็นแบบนี้

0 3 * * * /cmd/to/run >> /var/log/somelogfile.log

จากนั้นคุณสามารถจัดทำบันทึกและดูว่าเกิดอะไรขึ้น

sudo tail -f -n 50 /var/log/somelogfile.log

นี่คือสิ่งที่ฉันทำบนเซิร์ฟเวอร์ใด ๆ ที่ฉันเห็นข้อความนั้นใน syslog


ฉันทำสิ่งนี้แล้ว แต่ไม่มีการบันทึกลงในไฟล์
pir

คุณแน่ใจหรือไม่ว่างาน cron นั้นทำงานเหมือนเดิม?
Andrew MacNaughton

ใช่บันทึกระบบแสดงว่ากำลังเริ่มต้น
pir

1
คุณต้องการ '2> & 1' ที่ท้ายบรรทัดเพื่อดักจับเอาต์พุตไปยัง stderr ลงในไฟล์
MattSmith

15

นี่เป็นคำถามเก่า แต่มีคำตอบเพิ่มเติมที่มีประโยชน์ในบางสถานการณ์

ไพพ์เอาต์พุตของคำสั่ง cron ของคุณloggerเพื่อให้มันจบลงใน syslog

มันง่ายกว่าการติดตั้ง postfix เล็กน้อยและวางเอาต์พุตนี้ลงใน syslog ควบคู่กับบันทึกอื่น ๆ ของคุณ คำสั่งนี้จะจับ stdout และ stderr ดังนั้นคุณจะไม่เห็นNo MTA installedข้อความและคุณจะเห็นผลลัพธ์ทั้งหมดของคุณใน syslog

ตัวอย่างรายการ cron:

0 3 * * * (cmd1;  cmd2) 2>&1 | logger -t mycmd

คุณสามารถดูบันทึกด้วยแท็กของคุณmycmdโดยใช้:

grep 'mycmd' /var/log/syslog

ท่อทำงานในงาน cron หรือไม่
CivMeierFan

10

ผลข้างเคียงหนึ่งของการเพิ่ม/dev/null 2>&1ลงในคำสั่งงาน cron คือมันจะทิ้งทั้งสองSTDERRและSTDOUT(ข้อผิดพลาดมาตรฐานเช่นเดียวกับเอาท์พุท) วิธีนี้ใช้ได้ผลดีถ้าคุณไม่ต้องการอีเมลใด ๆ จาก cron แต่ถ้าคุณต้องการส่งข้อผิดพลาดทางอีเมลให้ใช้>/dev/nullแทน อ่านโพสต์บล็อกนี้สำหรับคำอธิบายเพิ่มเติม

คุณยังจะต้องติดตั้ง MTA (ตัวแทนการโอนอีเมล) เพื่อส่งอีเมลข้อผิดพลาด Postfix นั้นง่ายต่อการติดตั้งด้วย:sudo apt-get install postfix


เท่าที่ฉันเข้าใจ '> / dev / null' จะส่งเท่านั้นและ '> / dev / null 2> & 1' จะทำให้เกิดข้อผิดพลาดทั้งหมดหรือไม่ ฉันต้องใช้อะไรเพื่อรับข้อผิดพลาดในการเข้าสู่ระบบ แต่ไม่มีเมล ตอนนี้ฉันไม่ได้รับอีเมล (ตามที่ฉันต้องการ) แต่น่าเกลียด 'ไม่มีเอ็มที…'
พิต

2
ในขณะนี้, ไม่มีวิธีการบันทึกผลลัพธ์อื่น ๆ นอกเหนือจากการส่งไปยังอีเมล สิ่งที่ใกล้เคียงที่สุดที่คุณสามารถทำได้คือการตั้งค่า postfix สำหรับการส่งจดหมายในพื้นที่ (ถ้าคุณเรียกใช้ "sudo apt-get install postfix" มันจะแจ้งให้คุณทราบว่าคุณต้องการตั้งค่าการจัดส่งในท้องที่หรือไม่ ดีกว่ามากเมื่อใดก็ตามที่ฉันลงชื่อเข้าใช้ผ่าน ssh ฉันจะเห็นอีเมลใหม่บนเครื่องหากงานก่อนหน้านี้ล้มเหลวฉันพบว่าสะดวกกว่าการตรวจสอบบันทึก
paneer_tikka

2
  1. ในตอนแรกให้ติดตั้งpostfixซึ่งสามารถแก้ไขปัญหาได้

    sudo apt-get install postfix
    
  2. หาก Ubuntu คุณสามารถแก้ไขcrontabไฟล์ได้

    sudo vim /etc/crontab
    
  3. ข้อควรระวัง, แก้ไขไฟล์ด้านบน, ไม่ใช่รหัสใด ๆ ในบรรทัดแรก, และป้อน

    MAILTO=root // current system user
    
  4. เมื่อcronทำงานใด ๆ , คุณจะได้รับอีเมล

    mail
    

1
คำตอบของคุณดูเหมือนจะดี แต่ฉันไม่สามารถเข้าใจคำแนะนำทั้งหมดได้ บางทีคุณสามารถปรับปรุงได้
zx485

1

คุณสามารถตั้งค่าMAILTO=””ตัวแปรเมื่อเริ่มต้นcrontabไฟล์ของคุณ นี่จะเป็นการปิดการแจ้งเตือนทางอีเมลด้วย แก้ไข / เปิดงาน cron ของคุณ:

$ crontab -e

ที่ด้านบนของไฟล์ให้ป้อน:

MAILTO=""

https://www.cyberciti.biz/faq/disable-the-mail-alert-by-crontab-command/


1

ฉันมีปัญหานี้โดยใช้เครื่องมือ Kitematic เทียบท่า ไปที่ตู้คอนเทนเนอร์วีโอไอพีและคลิกที่
exe

จากนั้นเรียกใช้

apt-get update

นี่คือถ้าคุณกำลังพยายามทำให้วีโอไอพีวิ่งบนคิตะแมคโคร บันทึกจะแสดงข้อผิดพลาดนี้บนเครื่องเสมือน:

ต้องการอัปเดต

ขออภัยถ้าสิ่งนี้ทำให้คุณหลงทาง แต่นั่นเป็นวิธีการทำงาน คุณหลงทางอยู่เรื่อย ๆ แต่อ่านต่อไปและชิ้นส่วนจะมารวมกันในวันหนึ่ง ใจเย็น ๆ

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