it-swarm-vi.com

Làm cách nào để nhận e-mail từ (thất bại) công việc định kỳ trong Ubuntu?

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

[email protected]:~$ 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ó SSMTP đã cài đặt và hoạt động, 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.

46
Deleted

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 này là root được đặt bí danh cho người dùng khác trên hệ thống, ví dụ: đố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' vào đị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 protected]"

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, xem crontab (5) bằng cách chạy:

man 5 crontab
62
Philip Reynolds

Để 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 đến địa chỉ email thực.

Thêm MAILTO = "[email protected]" 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 gửi email chỉ dễ dàng khi chúng gặp lỗi chỉ cần làm điều này:

MAILTO="[email protected]"
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ù.

29
Theozaurus

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 biến MAILTO. Ví dụ, đặt phần sau ở trên cùng của tập lệnh.

MAILTO="[email protected]"
8
Dan Carley

hãy thử thêm "root: [email protected]" 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ư.

5
Daniel P

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 tất cả đáng tin cậy.

3
Low Kian Seong

Tôi không nghĩ SSMTP tùy thuộc vào những gì bạn cần. 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.

2
David Mackintosh

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 ...

2
irdroid3