Vô hiệu hóa email cron trừ khi có lỗi?


12

Làm cách nào tôi chỉ có thể nhận email từ cron nếu có lỗi?

Trong phần lớn các trường hợp, các tác vụ sẽ chạy tốt - và tôi thực sự không quan tâm đến đầu ra.

Nó chỉ là trong trường hợp hiếm hoi của một thất bại mà tôi muốn / cần biết.

Tôi có sẵn procmail - nhưng tôi không chắc liệu những gì tôi mô tả có thể quản lý bên ngoài để cron "chính xác" hay không.


Nếu crond không chạy thì sao? Hay máy đang offline? Đó là lý do tại sao tôi không bao giờ bận tâm với email từ cron và sử dụng dịch vụ giám sát cron chuyên dụng. Tôi là một phần của WDT.io và giới thiệu nó.
Christian Pekeler

Câu trả lời:


8

Vì bạn không quan tâm đến đầu ra, bạn có thể chuyển hướng STDOUT của công việc sang /dev/nullvà để STDERR được gửi qua thư (sử dụng MAILTObiến môi trường).

Ví dụ:

...
...
MAILTO=foobar@example.com
...
...
* * * * * /my/script.sh >/dev/null

sẽ gửi thư khi chỉ có đầu ra trên STDERR (với STDERR) và sẽ loại bỏ STDOUT.

Tất nhiên, điều này giả định rằng khi một chương trình được viết trên STDERR, đã thất bại; điều này có thể không phải luôn luôn như vậy. Nếu bạn có quyền kiểm soát chương trình, bạn có thể làm cho nó làm như vậy. Đối với bất kỳ trường hợp phức tạp nào, bạn nên viết một trình bao bọc của một số loại chạy (các) lệnh và gửi thư tương ứng. Và đặt bọc là croncông việc.


1
Nhược điểm của phương pháp này là khi thất bại, bạn chỉ nhận được đầu ra STDERR có thể khiến chẩn đoán khó hơn so với khi bạn có đầu ra đầy đủ.
cắm vào

10

Các chroniclệnh từ moreutils chạy một lệnh lặng lẽ trừ khi nó không thành công.

Trích dẫn từ hướng dẫn của nó:

mãn tính chạy một lệnh và sắp xếp cho lỗi tiêu chuẩn của nó và lỗi tiêu chuẩn chỉ được hiển thị nếu lệnh không thành công (thoát không khác hoặc gặp sự cố). Nếu lệnh thành công, mọi đầu ra không liên quan sẽ bị ẩn.

Một sử dụng phổ biến cho mãn tính là để chạy một công việc định kỳ. Thay vì cố gắng giữ cho lệnh im lặng và phải xử lý các thư có chứa đầu ra ngẫu nhiên khi nó thành công và không đủ độ dài đầu ra khi thất bại, bạn chỉ có thể chạy nó một cách rõ ràng và sử dụng mãn tính để ẩn đầu ra thành công.


8

Làm cách nào tôi chỉ có thể nhận email từ cron nếu có lỗi?

Bạn có thể gói các yêu cầu cron của mình bằng cronic , script script ăn đầu ra cron trừ khi mã trả về của quá trình được gọi là khác không hoặc có đầu ra lỗi không theo dõi.

Để sử dụng cronic, tải tập lệnh đến một vị trí phù hợp, chẳng hạn như /usr/local/bin. Các mục crontab của bạn phải được thêm tiền tố vào đường dẫn đến tập lệnh (ví dụ /usr/local/bin/cronic), hoặc đơn giản cronic, miễn PATHlà bạn được đặt đúng.

Xin lưu ý rằng "lỗi" là một thuật ngữ không xác định trong câu hỏi của bạn và yêu cầu định nghĩa cẩn thận. Để Cronic trở nên hữu ích, bạn phải đảm bảo các công việc bạn xử lý với các lỗi báo cáo mỉa mai theo một trong những cách xác định điều kiện lỗi. Các phương pháp báo cáo ngầm định, chẳng hạn như viết các chuỗi văn bản tới STDOUT, sẽ đòi hỏi phải suy nghĩ thêm để làm cho điều này tương thích với cơ chế báo cáo cron hoặc cron khác.

Các trình bao bọc khác có sẵn, như được liên kết từ trang web mỉa mai:


1
cronicliên quan đến chronic, hoặc đó chỉ là sự trùng hợp?
Toby Speight

@TobySpeight Sự trùng hợp dường như. cronicđược thực hiện trong bash, chronicnhư được đề xuất trong câu trả lời trước đó là tập lệnh Perl.
Vũ trụ Ossifrage

4

Đâ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 lỗi . Đ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ể:

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.


Bạn nên đặt $OUTPUTtrong dấu ngoặc kép : "$OUTPUT".
G-Man nói 'Phục hồi Monica'

@ G-Man Điểm công bằng, luôn có khả năng đầu ra có thể chứa "-n" hoặc một cái gì đó tương tự.
Akom

0

Tôi có lẽ đã không nghĩ đến điều này suốt, nhưng

* * * * * yourthing.sh >/tmp/yourthing.log && rm -f /tmp/yourthing.log; cat /tmp/yourthing.log 2>/dev/null

trong trường hợp thông thường, sẽ chuyển hướng mọi thứ đến một tệp tạm thời (có thể bạn muốn sử dụng mktempđể có được một tên tệp duy nhất), xóa nó nếu tệp thành công, và sau đó catnội dung lại, nếu chúng vẫn tồn tại (ví dụ: yourthing.sh đã thoát với tình trạng lỗi), sẽ được chọn bởi người gửi thư cron.

Nếu bộ nhớ phục vụ, cron đã không gửi bất cứ thứ gì nếu không có đầu ra, vì vậy nếu tệp nhật ký trống hoặc không tồn tại, không có gì xảy ra. (Chúng tôi chuyển hướng thông báo lỗi đi.)

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.