Ghi nhật ký TẤT CẢ đầu ra stderr của crontab vào tệp


12

Ví dụ: tôi có thể đăng nhập stderrmột tập lệnh theo cách này:

* * * * * run_script.sh > /var/log.txt 2>&1

Nhưng tôi muốn đăng nhập stderrtất cả các tập lệnh trong crontab của tôi. Tôi có thể nối thêm > /var/log.txt 2>&1tất cả các tập lệnh, nhưng sẽ không tốt nếu tôi có hàng trăm tập lệnh cron. Có cách nào khác, đơn giản hơn để làm điều này?

Câu trả lời:


6

Trong crontab, bạn có thể đặt MAILTO để trỏ đến một bí danh thư chạy tập lệnh. Kịch bản đó sẽ chấp nhận một thông điệp thư, loại bỏ các tiêu đề và các mục khác và đăng nhập phần còn lại bằng logger. Vì tất cả đầu ra tập lệnh cron được gửi đến địa chỉ do MAILTO chỉ định, bạn sẽ nắm bắt mọi thứ.

Ví dụ: trong crontab

MAILTO=myalias

Trong / etc / mail / bí danh (giả sử bạn đang sử dụng sendmail)

myalias:"|/usr/local/bin/my-processing-script.sh"

và có đoạn script loại bỏ các tiêu đề thư và xử lý đầu ra cron.


bạn có thể cụ thể hơn về việc thiết lập MAILTO, bí danh, MTA, script, v.v.?
endolith

1
@endolith Tôi đã chỉnh sửa câu trả lời để đưa ra một thiết lập cơ bản phù hợp với sendmail và các MTA tương thích rộng rãi. Bạn sẽ phải tự viết kịch bản.
Kyle Jones

5

Bất kỳ đầu ra nào được tạo bởi một lệnh được gửi đến người dùng được chỉ định trong biến môi trường MAILTO như được đặt trong tệp crontab (5) hoặc, nếu không có biến MAILTO nào được đặt (hoặc nếu đây là một công việc tại (1) hoặc đợt (1) ), cho chủ sở hữu của công việc. Nếu một lệnh không tạo ra đầu ra hoặc nếu biến môi trường MAILTO được đặt thành chuỗi trống, sẽ không có thư nào được gửi.

Vì nó sử dụng thư cục bộ, bạn thực sự không cần thiết lập bất cứ thứ gì, hoặc có thể chỉ cần cài đặt mailx nếu nó chưa có ở đây. Cron sẽ gửi cho bạn đầu ra, bạn có thể lưu thư trong một tệp và làm nhiều việc từ đó. Cố gắng sửa đổi cách cron hoạt động để phù hợp trực tiếp với nhu cầu của bạn không phải là cách để đi. Nếu bạn không nghĩ vậy, chỉ cần vá và cài đặt lại cron, gọi nó là my_cron và sử dụng nó thay vì cron. Và hãy chuẩn bị để cuối cùng giữ my_cron của bạn cập nhật và xây dựng lại nó thường xuyên.

Thêm phần này vào đầu tất cả các tập lệnh của bạn để ghi nhật ký mọi thứ và dừng ở lỗi đầu tiên

exec 2>&1 > /var/log/YOUR_LOG_FILE
set -e

thứ tự chuyển hướng có nên ngược lại? > /var/log/YOUR_LOG_FILE 2>&1tức là, đầu tiên chuyển hướng thiết bị xuất chuẩn vào một tệp và chỉ sau đó chuyển hướng thiết bị xuất chuẩn sang thiết bị xuất chuẩn (hiện chỉ đến tệp).
jfs

Thật là điên rồ khi trên một máy chủ tối thiểu mà bạn cần cài đặt dịch vụ thư và có thể là ứng dụng thư khách, chỉ để đọc các lỗi do Cron tạo ra. Nó cảm thấy như một quyết định thiết kế vô chính phủ.
James McMahon

0

Kịch bản của Ryan Ye tại /programming//a/7145618/20774 cũng hữu ích cho việc này, mặc dù nó có cả thiết bị xuất chuẩn và thiết bị xuất chuẩn.


Tôi có một kịch bản nhỏ cronlog.sh để làm điều này. Mã script

#!/bin/sh
echo "[`date`] Start executing $1"
$@ 2>&1 | sed -e "s/\(.*\)/[`date`] \1/"
echo "[`date`] End executing $1"

Sau đó bạn có thể làm

cronlog.sh /opt/scripts/sql_fetch >> your_log_file

Kết quả ví dụ

cronlog.sh echo 'hello world!'

[Mon Aug 22 04:46:03 CDT 2011] Start executing echo
[Mon Aug 22 04:46:03 CDT 2011] helloworld!
[Mon Aug 22 04:46:03 CDT 2011] End executing echo
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.