วิธีรับอีเมล (ล้มเหลว) cron-jobs ใน Ubuntu


45

ฉันสร้าง cron-jobs ใน Ubuntu โดยวางปฏิบัติการไว้ในหนึ่งใน/etc/cron.{daily,hourly,monthly,weekly}นั้น มีไดเรกทอรีจำนวนมากที่ขึ้นต้นด้วย cron:

kent@rat:~$ ls -ld /etc/cron*
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.d
drwxr-xr-x 2 root root 4096 2009-07-16 13:17 /etc/cron.daily
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.hourly
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.monthly
-rw-r--r-- 1 root root  724 2009-05-16 23:49 /etc/crontab
drwxr-xr-x 2 root root 4096 2009-06-06 18:52 /etc/cron.weekly

ฉันต้องการรับอีเมลจากสคริปต์ของฉันเมื่อ:

  1. สคริปต์ล้มเหลวและกำหนดรหัสการออกให้ไม่ใช่ศูนย์
  2. สคริปต์มีบางอย่างที่จะบอกฉัน

ฉันมีSSMTPติดตั้งและใช้งานได้ฉันส่งจดหมายจากบัญชี Google ของฉัน ความจริงที่ว่า SSMTP สามารถส่งจดหมายโดยใช้บัญชีเดียวนั้นไม่ใช่ปัญหาสำหรับฉัน มันเป็นแค่เซิร์ฟเวอร์ภายในบ้านและผู้ใช้ที่ฉันไม่มีความสามารถในการเพิ่มงาน cron

ฉันต้องการทราบว่าการส่งจดหมายจากสคริปต์มักทำงานใน Linux / Unix โดยทั่วไปและใน Ubuntu โดยเฉพาะอย่างไร ฉันต้องการทราบวิธีที่ดีสำหรับฉันในการรับอีเมลในสองสถานการณ์ข้างต้น

คำตอบ:


60

โดยค่าเริ่มต้น cron จะส่งอีเมลถึงเจ้าของบัญชีที่ crontab ทำงานอยู่

crontab ทั้งระบบอยู่ใน / etc / crontab ทำงานภายใต้ผู้ใช้ `root '

เนื่องจากใช้กันอย่างแพร่หลายฉันขอแนะนำให้เพิ่มชื่อแทนไปยังไฟล์ / etc / aliases ของคุณ (เรียกใช้ 'newaliases' หลังจาก)

วิธีการปกติในการจัดโครงสร้างนี้เป็นรูทที่จะใช้นามแฝงกับผู้ใช้รายอื่นในระบบเช่นสำหรับฉันฉันจะตั้งชื่อ 'root' เป็น 'phil' (บัญชีผู้ใช้ของฉัน) และนามแฝง 'phil' ตามที่อยู่อีเมลภายนอกของฉัน

หากคุณมีผู้ใช้เฉพาะ cron ที่คุณต้องการส่งอีเมลถึงคุณในเอาต์พุตคุณสามารถใช้ / etc / aliases อีกครั้ง (หากคุณมีสิทธิ์เข้าถึง superuser) เพื่อเปลี่ยนเส้นทางผู้ใช้ไปยังที่อยู่อีเมลอื่นหรือคุณสามารถใช้สิ่งต่อไปนี้ได้ที่ ด้านบนของ crontab ของคุณ:

MAILTO="email@domain.com"

หากควรส่งจดหมายถึงผู้ใช้ในพื้นที่คุณสามารถใส่ชื่อผู้ใช้แทน:

MAILTO=someuser

หากคุณต้องการข้อมูลเพิ่มเติมดู crontab (5) โดยการเรียกใช้:

man 5 crontab

/etc/aliasesรายการไม่ควรเป็นไปตามรูปแบบ name: value1, value2, ...ใช่หรือไม่ ฉันไม่รู้บางทีรูปแบบอาจเปลี่ยนแปลงในบางช่วงในช่วง 8 ปีที่ผ่านมา
นาธานโจนส์

1
"สำหรับฉันฉันได้ตั้งชื่อ 'root' เป็น 'phil' (บัญชีผู้ใช้ของฉัน) และชื่อแทน 'phil' ไปยังที่อยู่อีเมลภายนอกของฉัน" จะสร้างนามแฝง 'phil' ไปยังที่อยู่อีเมลภายนอกได้อย่างไร
Howard Lee

29

ในการรับอีเมลที่ส่งจาก vixie cron คุณจะต้องมีสิ่งที่ทำซ้ำคำสั่ง sendmail ดังนั้นการติดตั้ง postfix หรือ SSMTP จะแยกส่วนนี้ออก หากคุณใช้ postfix คุณสามารถใช้ไฟล์นามแฝงเพื่อแมปผู้ใช้ระบบกับที่อยู่อีเมลจริง

การเพิ่ม MAILTO = "foo@bar.com" ที่ด้านบนของ crontab จะทำให้มีการส่งอีเมลใด ๆ จากงาน cron นี่คือไม่คำนึงถึงรหัสข้อผิดพลาด

สำหรับสคริปต์ที่ส่งออกข้อผิดพลาดอย่างถูกต้องไปยัง STDERR ดังนั้นการรับอีเมลทางอีเมลก็ต่อเมื่อเกิดความผิดพลาดเพียงทำสิ่งนี้:

MAILTO="foo@bar.com"
0 5 * * * /bin/some_script > /dev/null

สิ่งนี้จะเปลี่ยนเส้นทางเพียง STDOUT ไปเป็นโมฆะ หากมีข้อความ STDERR ปรากฏขึ้นพวกเขาจะได้รับอีเมลถึงคุณ

อย่างไรก็ตามฉันพบว่าสคริปต์บางตัวจะส่งออกข้อผิดพลาดอย่างไม่ถูกต้องในฐานะ STDOUT และตั้งรหัสออกเป็น 1 ฉันยังไม่ได้คิดหาวิธีที่จะดึงเอาท์พุทจากสิ่งเหล่านี้ ฉันคิดว่าคือการเปลี่ยนเส้นทางการส่งออกไปยังไฟล์แล้วถ้ารหัสทางออกไม่ได้เป็นเอาท์พุท 0 ไฟล์ที่ cron ที่จะคว้า ดูเหมือนว่าน่ากลัว แต่


3
สามารถลองhabilis.net/cronic
dfrankow

8

หากคุณต้องการที่จะส่งออกทั้งหมด (stdout และ stderr) ไปยังที่อยู่ที่เฉพาะเจาะจงจากนั้นคุณสามารถใช้MAILTOตัวแปร ตัวอย่างเช่นวางต่อไปนี้ที่ด้านบนของสคริปต์

MAILTO="address@example.com"

5

ลองเพิ่ม "root: your@email.address" ใน / etc / aliases

ที่จะส่งข้อความทั้งหมดสำหรับผู้ใช้ไปยังอีเมลของคุณ หากคุณไม่ต้องการข้อความทั้งหมดคุณสามารถสร้างผู้ใช้เฉพาะสำหรับสิ่งนี้

ตราบใดที่สคริปต์แสดงผลออกมาคุณก็จะได้รับจดหมาย


3

ในเซิร์ฟเวอร์โปรดักชั่นของฉันซึ่งโดยทั่วไปจะทำงานประมาณ 20 cronjobs ทุกวันฉันสาบานด้วยแพ็คเกจ python-cronwrap ตรวจสอบออกที่นี่: http://pypi.python.org/pypi/cronwrap มันง่ายมากในการกำหนดค่าและส่วนใหญ่เชื่อถือได้ทั้งหมด


2

ฉันไม่คิดว่า SSMTP ขึ้นอยู่กับสิ่งที่คุณต้องการจะทำ คุณต้องการบางสิ่งที่สามารถ "รับ" เมลจากกระบวนการ cron แล้วส่งไปยังกล่องจดหมายจริงของคุณ

ฉันใช้ Sendmail แต่นั่นเป็นเพราะฉันเป็นมืออา ฉันรู้ว่ามันน่าหัวเราะสำหรับเด็ก ๆ ทุกคนที่ใช้ Postfix ชุมชนอูบุนตูของคุณสามารถแนะนำคุณเกี่ยวกับการตั้งค่าระบบอีเมลของคุณ


ssmtp นำไปปฏิบัติ / bin / sendmail
bobpaul

2

อีกทางเลือกหนึ่ง - ฉันเก็บเมลรูททั้งหมดไปยังไฟล์บางไฟล์แล้วลบเมลต้นฉบับ

ฉัน cron สคริปต์ (นี่คือส่วนสำคัญ) -

#!/bin/bash
if `/usr/bin/mail -e`; then
   /usr/bin/mail --print 2>&1 > /tmp/email_${date +"%Y-%m-%d_%H.%M").log
   echo ‘d *’ | /usr/bin/mail -N > /dev/null
fi
exit 0

สิ่งนี้ทำให้สิ่งต่าง ๆ เป็นระเบียบและฉันสามารถจับตาดูมันได้ ฉันสามารถส่งอีเมลไฟล์อีเมลรายวันไปยังรหัสอีเมลภายนอก ฯลฯ ...

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