cron
đã gửi đầu ra tiêu chuẩn và lỗi tiêu chuẩn của mọi công việc mà nó chạy qua thư cho chủ sở hữu của công việc định kỳ.
Bạn có thể sử dụng MAILTO=recipient
trong crontab
tệp để gửi email đến một tài khoản khác.
Để làm việc này, bạn cần phải có thư hoạt động đúng. Việc gửi đến hộp thư cục bộ thường không phải là vấn đề (thực tế, rất có thể làls -l "$MAIL"
sẽ tiết lộ rằng bạn đã nhận được một số) nhưng việc đưa nó ra khỏi hộp và ra internet đòi hỏi MTA (Postfix, Sendmail, bạn có gì) được cấu hình đúng để kết nối với thế giới.
Nếu không có đầu ra, sẽ không có email nào được tạo.
Một cách sắp xếp phổ biến là chuyển hướng đầu ra sang một tệp, trong trường hợp đó, trình nền cron sẽ không thấy công việc trả về bất kỳ đầu ra nào. Một biến thể là chuyển hướng đầu ra tiêu chuẩn sang một tệp (hoặc viết tập lệnh để nó không bao giờ in bất cứ thứ gì - có lẽ nó lưu kết quả trong cơ sở dữ liệu hoặc thực hiện các tác vụ bảo trì đơn giản là không xuất bất cứ thứ gì?) Và chỉ nhận được email nếu có là một thông báo lỗi.
Để chuyển hướng cả hai luồng đầu ra, cú pháp là
42 17 * * * script >>stdout.log 2>>stderr.log
Lưu ý cách chúng ta chắp thêm (gấp đôi >>
) thay vì ghi đè, để bất kỳ đầu ra nào của công việc trước đó không bị thay thế bởi công việc tiếp theo.
Như được đề xuất trong nhiều câu trả lời ở đây, bạn có thể gửi cả hai luồng đầu ra vào một tệp; thay thế chuyển hướng thứ hai bằng 2>&1
"lỗi tiêu chuẩn sẽ xuất hiện ở bất cứ nơi nào có đầu ra tiêu chuẩn". (Nhưng tôi không đặc biệt tán thành cách làm này. Điều này chủ yếu có ý nghĩa nếu bạn không thực sự mong đợi bất cứ điều gì về đầu ra tiêu chuẩn, nhưng có thể đã bỏ qua điều gì đó, có lẽ đến từ một công cụ bên ngoài được gọi từ tập lệnh của bạn.)
cron
các công việc chạy trong thư mục nhà của bạn, vì vậy bất kỳ tên tệp tương đối nào cũng phải liên quan đến điều đó. Nếu bạn muốn viết bên ngoài thư mục chính của mình, rõ ràng bạn cần phải đảm bảo riêng bạn có quyền truy cập ghi vào tệp đích đó.
Một phản mẫu phổ biến là chuyển hướng mọi thứ đến /dev/null
(và sau đó yêu cầu Stack Overflow giúp bạn tìm ra lỗi đã xảy ra khi có gì đó không hoạt động; nhưng chúng ta cũng không thể thấy đầu ra bị mất!)
Từ trong tập lệnh của bạn, đảm bảo tách riêng đầu ra (kết quả thực tế, lý tưởng ở dạng có thể đọc được bằng máy) và chẩn đoán (thường được định dạng cho người đọc). Trong một kịch bản shell,
echo "$results" # regular results go to stdout
echo "$0: something went wrong" >&2
Một số nền tảng (và ví dụ GNU Awk) cho phép bạn sử dụng tên tệp /dev/stderr
cho các thông báo lỗi, nhưng điều này không đúng cách; trong Perl, warn
và die
in lỗi tiêu chuẩn; trong Python, viết sys.stderr
hoặc sử dụng logging
; trong Ruby, hãy thử $stderr.puts
. Cũng lưu ý cách thông báo lỗi nên bao gồm tên của tập lệnh tạo ra thông báo chẩn đoán.