Làm cách nào để nhận e-mail từ (thất bại) cron-jobs trong Ubuntu?


45

Tôi tạo các công việc định kỳ trong Ubuntu bằng cách đặt tệp thực thi vào một trong số đó /etc/cron.{daily,hourly,monthly,weekly}. Có rất nhiều thư mục bắt đầu bằng 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

Tôi muốn nhận e-mail từ các tập lệnh của mình khi:

  1. Một tập lệnh thất bại và đưa ra một mã thoát khác không.
  2. Kịch bản có gì đó muốn nói với tôi

Tôi đã cài đặt và làm việc SSMTP , tôi gửi thư từ tài khoản Google của mình. Việc SSMTP chỉ có thể gửi thư bằng một tài khoản không phải là vấn đề đối với tôi. Nó chỉ là một máy chủ gia đình và những người dùng tôi không có khả năng thêm các công việc định kỳ.

Tôi muốn biết cách gửi thư từ các tập lệnh thường hoạt động trong Linux / Unix nói chung và trong Ubuntu nói riêng. Tôi cũng muốn biết một cách tốt để tôi nhận được thư trong hai tình huống trên.

Câu trả lời:


60

Theo mặc định, cron sẽ gửi email cho chủ sở hữu của tài khoản mà crontab đang chạy.

Crontab trên toàn hệ thống nằm trong / etc / crontab chạy dưới quyền 'root' của người dùng

Bởi vì root được sử dụng rộng rãi, tôi khuyên bạn nên thêm bí danh gốc vào tập tin / etc / aliases của bạn. (chạy 'newaliases' sau)

Cách thông thường để cấu trúc điều này là root được đặt bí danh cho một người dùng khác trên hệ thống, ví dụ như đối với tôi, tôi sẽ đặt bí danh 'root' thành 'phil' (tài khoản người dùng của tôi) và bí danh 'phil' cho địa chỉ email bên ngoài của tôi.

Nếu bạn có một cron người dùng cụ thể mà bạn muốn gửi email cho bạn ở đầu ra, bạn có thể sử dụng lại / etc / bí danh (cung cấp cho bạn quyền truy cập siêu người dùng) để chuyển hướng người dùng đến địa chỉ email khác hoặc bạn có thể sử dụng thông tin sau tại đầu crontab của bạn:

MAILTO="email@domain.com"

Nếu thư nên được gửi đến người dùng cục bộ, bạn chỉ có thể đặt tên người dùng:

MAILTO=someuser

Nếu bạn cần thêm thông tin, hãy xem crontab (5) bằng cách chạy:

man 5 crontab

Các /etc/aliasesmục không phải theo định dạng name: value1, value2, ... ? Tôi không biết, có thể định dạng đã được thay đổi tại một số điểm trong 8 năm qua.
Nathan Jones

1
"đối với tôi, tôi đặt bí danh 'root' thành 'phil' (tài khoản người dùng của tôi) và bí danh 'phil' cho địa chỉ email bên ngoài của tôi." Làm cách nào để đặt bí danh 'phil' cho một địa chỉ email bên ngoài?
Howard Lee

29

Để nhận email được gửi từ vixie cron, bạn sẽ cần một cái gì đó sao chép lệnh sendmail. Vì vậy, cài đặt postfix hoặc SSMTP sẽ sắp xếp phần này ra. Nếu bạn sử dụng postfix thì tệp bí danh có thể được sử dụng để ánh xạ người dùng hệ thống tới địa chỉ email thực.

Thêm MAILTO = "foo@bar.com" vào đầu crontab sẽ khiến bất kỳ đầu ra nào từ công việc định kỳ được gửi qua email. Điều này là bất kể mã lỗi.

Đối với các tập lệnh xuất lỗi chính xác vào STDERR thì việc nhận email chỉ dễ dàng khi chúng gặp lỗi chỉ cần làm điều này:

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

Điều này sẽ chuyển hướng chỉ STDOUT thành null. Nếu có bất kỳ tin nhắn STDERR nào, họ sẽ nhận được email cho bạn.

Tuy nhiên, tôi đã tìm thấy một số tập lệnh sẽ xuất lỗi không chính xác như STDOUT và đặt mã thoát thành 1. Tôi chưa tìm ra cách lấy đầu ra từ các tập lệnh này, nhưng bỏ qua đầu ra nếu mã thoát là 0. Phương thức duy nhất Tôi có thể nghĩ là chuyển hướng đầu ra thành một tệp, sau đó nếu mã thoát không phải là đầu ra 0 thì tệp đó cho cron lấy. Có vẻ khá kinh khủng mặc dù.


3
Có thể dùng thử habilis.net/cronic
dfrankow

8

Nếu bạn muốn gửi tất cả đầu ra (stdout và stderr) đến một địa chỉ cụ thể thì bạn có thể sử dụng MAILTObiến. Ví dụ, đặt phần sau ở trên cùng của tập lệnh.

MAILTO="address@example.com"

5

thử thêm "root: your@email.address" vào / etc / bí danh

sẽ gửi tất cả tin nhắn cho người dùng đó đến email của bạn. nếu bạn không muốn tất cả các tin nhắn, bạn có thể tạo một người dùng đặc biệt cho việc này.

Miễn là tập lệnh xuất ra một cái gì đó, bạn sẽ nhận được một thư.


3

Trên tất cả các máy chủ sản xuất của tôi thường chạy khoảng 20 cronjob mỗi ngày, tôi thề với gói python-cronwrap. Kiểm tra nó ở đây: http://pypi.python.org/pypi/cronwrap . Nó thực sự dễ dàng để cấu hình và hầu hết đáng tin cậy.


2

Tôi không nghĩ SSMTP tùy thuộc vào những gì bạn cần nó để làm. Bạn cần một cái gì đó có thể "nhận" thư từ các quy trình định kỳ và sau đó gửi nó đến hộp thư thực sự của bạn.

Tôi sử dụng Sendmail, nhưng đó là vì tôi là một tay già; Tôi biết rằng tất cả những đứa trẻ tuyệt vời ngày nay sử dụng Postfix đều bị cười nhạo. Cộng đồng ubfox của bạn có thể hướng dẫn bạn thiết lập hệ thống thư của bạn.


ssmtp thực hiện / bin / sendmail
bobpaul

2

Một cách khác - tôi lưu trữ tất cả thư gốc vào một số tệp và sau đó xóa thư gốc.

Tôi cron một kịch bản (đây là phần quan trọng) -

#!/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

Điều này giữ cho mọi thứ gọn gàng và tôi có thể để mắt đến nó. Tôi có thể gửi email một tệp thư hàng ngày ra một id email bên ngoài, v.v ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.