2009-09-08 30 views
18

Tôi có một số tập lệnh python chạy trên cơ sở hàng ngày trong cron. Làm thế nào tôi có thể có cron gửi cho tôi một email CHỈ KHI CÓ STDERR OUTPUT từ tập lệnh của tôi? Tôi muốn có thể gửi thư cho nhiều người nhận và đặt riêng dòng chủ đề cho mỗi mục nhập cron.Cron gửi email với STDERR nhưng KHÔNG STDOUT?

Tôi cố gắng này:

./prog > /dev/null | mail . . . 

nhưng nó đã không làm việc - tôi vẫn nhận được email trống khi không có thiết bị lỗi chuẩn. Tôi có cần phải làm điều này trong chính kịch bản không?

Xin lỗi nếu điều này có vẻ cơ bản, tôi đã googled rất nhiều nhưng dường như không thể tìm thấy câu trả lời này một cách thành công.

Trả lời

8

Bài kiểm tra tệp -s sẽ cho bạn biết nếu tệp tồn tại và có kích thước lớn hơn 0.

./prog >/dev/null 2>some/file ; if [ -s some/file ] ; then mail < some/file ; fi 
+0

Tôi đã kết thúc bằng cách sử dụng một biến thể của phương pháp này. Cảm ơn mobrule – g33kz0r

+0

tìm thấy một bài viết tốt về điều này đã giúp tôi .. http://www.xaprb.com/blog/2006/06/06/what-does-devnull-21-mean/ – ishan

23

Đối với cron bạn không cần phải gửi qua đường bưu điện. Các cron daemon sẽ tự động gửi bất kỳ đầu ra của lệnh của bạn cho bạn. Mục nhập crontab của bạn sẽ trông giống như:

# every minute 
* * * * * ./prog >/dev/null 

Nếu không có đầu ra STDERR, bạn sẽ không nhận được bất kỳ thư nào.

+1

"Nếu không có đầu ra STDERR, bạn sẽ không nhận được bất kỳ thư nào." Đó là sự thật, nếu tôi đặt MAILTO = "me @ mine". Tuy nhiên, nó KHÔNG đúng nếu đường ống đến mail (1). "Ngoài LOGNAME, HOME và SHELL, cron sẽ xem MAILTO nếu có bất kỳ lý do gì để gửi thư do chạy các lệnh trong 'this' crontab." - http://ss64.com/osx/crontab.html Tuy nhiên, tôi cần đặt _subject_ của thư và không có cách nào để thực hiện việc này (IMHO) với chính cron. Vì vậy, tôi đang mắc kẹt bằng cách sử dụng thư, mà vòng chúng tôi trở lại câu hỏi ban đầu của tôi. – g33kz0r

+1

Vấn đề với cách tiếp cận này là giả sử 'stdout' sẽ không chứa bất kỳ thông tin hữu ích nào trong trường hợp có lỗi.giải pháp 'cronic' làm việc tốt hơn cho tôi. –

12

email v1.6 có một tùy chọn để không gửi tin nhắn với một cơ thể trống rỗng:

-E  Do not send messages with an empty body. 
     This is useful for piping errors from cron(8) scripts. 

Đây có thể là những gì bạn đang tìm kiếm.

15

Bạn đang đặt câu hỏi không chính xác. Khi bạn đang sử dụng thư (1) để gửi email, nó không còn liên quan đến nó trong cron. Những gì bạn thực sự cần là để stderr ống stdin của thư. ống bình thường là từ stdout để stdin, vì vậy cách đơn giản nhất để giải quyết việc này là chuyển hướng:

{ /prog > /dev/null ; } 2>&1 | mail ...

Hoặc theo cách ít rõ ràng vì trật tự khó hiểu của redirectings:

/prog 2>&1 > /dev/null | mail ...

+1

Câu trả lời hay và kỹ thuật thích hợp để chỉ đạo cả stderr và stdout vào lệnh thư. Ví dụ thứ hai giảm stdout trên sàn và chỉ gửi stderr đến lệnh mail. –

+0

Tôi nghĩ đó là mục đích. –

8

Có là một công cụ tốt được gọi là cronic thực hiện điều này. Nó là một phần của gói moreutils.

+2

Trên Ubuntu 12.04 của tôi, nó là '' mãn tính'' (không phải '' cronic'') được gói gọn trong '' moreutils'', nó được viết bằng perl chứ không phải là bash, nhưng dường như có cùng mục đích. Dù sao cũng cảm ơn bạn ! – vaab

+1

'mãn tính' dường như xuất cả hai STDOUT và STDERR nếu chương trình thoát với một lỗi, hoặc không phải là nếu chương trình thoát sạch. Điều đó không hiệu quả với tôi. Tôi muốn một 'mãn tính' lọc ra STDOUT, độc lập với mã thoát. Một chuyển hướng đơn giản làm việc tốt nhất cho tôi. – richardkmiller

+1

Lưu ý rằng hành vi của 'cronic' và' chronic' khác: 'chronic' (' moreutils', Perl) không xuất ra bất cứ thứ gì nếu mã thoát là 0, ngay cả khi có gì đó trên STDERR. 'cronic' ([habilis.net] (http://habilis.net/cronic/), bash) xuất ra mọi thứ nếu có thứ gì đó trên STDERR, ngay cả khi mã thoát là 0. – Qtax

-2

Nếu SCRIPT của bạn có các lệnh có thể tạo ra STDERR mà bạn muốn được thông báo, thì bạn cần sử dụng một cuộc gọi mail hoặc mailx trong chính kịch bản lệnh (nếu có hoặc khác). Công việc cron STDOUT và chuyển hướng STDERR CHỈ dành cho công việc cron EXECUTION STDOUT và STDERR. hkmaly đã có nó ngay trên n

+3

thì tại sao bạn không upvote câu trả lời hkmalys ? điều này không có gì thêm – g33kz0r

Các vấn đề liên quan