Cron: Chỉ nhận được lỗi trong email?


38

Cuối cùng tôi đã thiết lập một lịch trình sao lưu thực tế trên dữ liệu của mình thông qua một tập lệnh shell, được xử lý bởi cron theo các khoảng thời gian chặt chẽ. Thật không may, tôi liên tục nhận được email trống mỗi lần CRON được thực thi và không chỉ khi có sự cố.

Có thể chỉ làm cho CRON gửi email khi có sự cố, tức là. Tôi TARkhông thực hiện như dự định?

Đây là cách crontab của tôi được thiết lập cho thời điểm này;

0 */2 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" email@example.com

Cảm ơn rất nhiều!

Câu trả lời:


53

Lý tưởng nhất là bạn muốn tập lệnh sao lưu của mình không xuất ra gì nếu mọi thứ diễn ra như mong đợi và chỉ tạo ra kết quả đầu ra khi có sự cố. Sau đó, sử dụng biến môi trường MAILTO để gửi bất kỳ đầu ra nào được tạo bởi tập lệnh của bạn đến địa chỉ email của bạn.

MAILTO=email@example.com
0 */2 * * * /bin/backup.sh

Nếu tập lệnh của bạn thường tạo đầu ra nhưng bạn không quan tâm đến nó trong cron, chỉ cần gửi nó đến / dev / null và nó sẽ chỉ gửi email cho bạn khi có gì đó được viết cho stderr.

MAILTO=email@example.com
0 */2 * * * /bin/backup.sh > /dev/null

9
Điều này là khó lý tưởng. Bạn thường muốn toàn bộ đầu ra (stdout + stderr) được gửi qua email cho bạn khi lệnh kết thúc với mã lỗi khác không. Mặt khác, nói chung là tốt để ngấu nghiến ít nhất là thiết bị xuất chuẩn. Đối với tôi, đây là một lỗ hổng thiết kế của cron.
Witiko

3
@Witiko Tôi đồng ý; Tôi tìm thấy câu hỏi này để cố gắng khắc phục điều đó. Tôi đoán bạn có thể thực hiện lệnh cron của bạn /bin/backup.sh > log_file || (echo Backup failed with exit status $?; cat log_file)?
Daniel H

22

Sử dụng kịch bản trình bao bọc mỉa mai trông giống như một ý tưởng tốt; để sử dụng nó, bạn không phải thay đổi tập lệnh của mình.

Thay vì:

 0 1 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" email@example.com

làm:

 MAILTO=email@example.com
 0 1 * * * cronic /bin/backup.sh

Chỉ cần đặt; nó sẽ chạy im lặng nếu mọi thứ chạy trơn tru (thoát trạng thái 0), nhưng nó sẽ báo cáo bằng lời nếu không, và để cron xử lý báo cáo thư.

Thông tin thêm về https://habilis.net/cronic/ .


Tôi thực sự không thấy điều đó sẽ giúp ích như thế nào khi vấn đề không gì khác hơn là một dòng cron không chính xác và cron đang làm chính xác những gì nó được bảo phải làm.
John Gardeniers

3
@JohnGardeniers nó giúp vì đôi khi bạn có đầu ra mà không có lỗi.
Mikhail

11
Ngoài ra, chronictừ moreutilsgói: joeyh.name/code/moreutils
Vladimir Panteleev

4

Bạn đặc biệt hướng dẫn cronluôn gửi email, ngay cả khi /bin/backup.sh(nhân tiện, nó phải ở trong /usr/local/bin) thành công. Chỉ cần bỏ qua | mail -s "Backup status" email@example.comphần và email sẽ chỉ được gửi khi có đầu ra. Bạn có thể (tùy thuộc vào bạn cron) đặt rõ ràng địa chỉ email thành thư thành một nhiệm vụ trong tệp crontab.

Để biết chi tiết, xem

man 5 crontab

3

Bạn nên chỉ đạo stderranmd không phải cả hai stdoutstderr.

Sử dụng 1> /dev/nullkhông 2>&1và nó sẽ ổn. Ngoài ra, bạn có thể cần báo cáo chính xác lỗi trong tập lệnh sao lưu của mình.


3

Đây là một biến thể khác mà tôi đã sử dụng thành công trong nhiều năm - nắm bắt đầu ra và chỉ in ra khi có lỗi , kích hoạt email. Điều này không yêu cầu tệp tạm thời và bảo toàn tất cả đầu ra . Phần quan trọng là 2>&1chuyển hướng STDERR sang STDOUT.

Gửi toàn bộ đầu ra thông qua cấu hình mail cron mặc định:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT"

Tương tự nhưng với một địa chỉ và chủ đề cụ thể:

(địa chỉ cũng có thể được thay đổi bằng cách đặt MAILTO = xxxx cho toàn bộ tệp crontab)

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT" | mail -s "Failed to backup" an@email.address

Bạn thậm chí có thể thực hiện nhiều hành động do lỗi và thêm vào email:

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || {echo "$OUTPUT" ; ls -ltr /backup/dir ; }

Điều này sẽ làm việc cho các lệnh đơn giản. Nếu bạn đang xử lý các đường ống phức tạp ( find / -type f | grep -v bla | tar something-or-other), thì tốt hơn hết bạn nên chuyển lệnh thành tập lệnh và chạy tập lệnh bằng cách sử dụng phương pháp đã nói ở trên. Lý do là nếu bất kỳ phần nào của đường ống xuất ra STDERR, bạn vẫn sẽ nhận được email.

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.