Làm cách nào để tôi hoàn toàn im lặng một cronjob thành / dev / null /?


72

Trên máy tính để bàn Ubuntu và trên máy chủ debian của tôi, tôi có một tập lệnh cần được thực thi mỗi phút (một tập lệnh gọi phút của bộ lông mày trực tuyến không gian của tôi ).

Vấn đề là trên debian phái sinh cron đang đăng nhập vào /var/log/syslogmỗi lần nó thực thi. Tôi cuối cùng đã thấy lặp đi lặp lại thông điệp mà nó đã được thực hiện lặp đi lặp lại trong /var/log/syslog:

Nov 11 16:50:01 eclabs /USR/SBIN/CRON[31636]: (root) CMD (/usr/bin/w3m -no-cookie http://www.spacetrace.org/secret_script.php > /dev/null 2>&1)

Tôi biết rằng để chặn đầu ra của chương trình, tôi có thể chuyển hướng nó tới /dev/null, ví dụ để ẩn tất cả các thông báo lỗi và cảnh báo khỏi chương trình, tôi có thể tạo một dòng trong crontab như thế này

* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null

Nhưng tôi muốn chạy một cronjob và chắc chắn rằng tất cả các đầu ra hoặc lỗi được tạo đều được chuyển sang NULL, vì vậy nó không tạo ra bất kỳ thư nào trong syslog và không tạo ra bất kỳ email nào


EDIT:
có một giải pháp để chuyển hướng các bản ghi cron thành một bản ghi riêng như đề xuất ở đây bằng cách thay đổi/etc/syslog.conf

Nhưng nhược điểm là, sau đó TẤT CẢ đầu ra của tất cả các cronjobs đều được chuyển hướng.

Tôi bằng cách nào đó chỉ có thể chuyển hướng một cronjob duy nhất đến một tệp nhật ký riêng biệt? Tốt nhất là cấu hình bên trong cron.hourlytập tin chính nó.


2
Bạn cũng có thể chỉ cần đặt MAILTO=""ở đầu tập tin cron. Điều này sẽ ngăn chặn tất cả các email. Và tôi chưa bao giờ nghe nói về một cron daemon gửi đầu ra công việc tới syslog (nhưng tôi đoán nó có thể).
Patrick

@Patrick - điều đó sẽ vô hiệu hóa mọi thứ, có thể ổn, nhưng chỉ cần lưu ý. Xem cập nhật của tôi, bạn có thể đặt nhiều mAILTO.
slm

Có, MAILTO=""vì dòng đầu tiên của crontab sẽ ngăn chặn mọi email. Ngoài ra, sử dụng trifecta đầy đủ trên các dòng lệnh của bạn nếu bạn đang chặn tất cả đầu ra .. Tất cả 3 loại đều được chuyển hướng bởi chuỗi này: >/dev/null 2>&1 - Tất nhiên, bạn có thể có đoạn mã bao gồm ghi định kỳ vào một nhật ký riêng.
SDsolar

Câu trả lời:


119

Tạo dòng này:

* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null 2>&1

Điều này sẽ nắm bắt cả STDOUT (1) và STDERR (2) và gửi chúng đến /dev/null.

MAILTO

Bạn cũng có thể vô hiệu hóa email bằng cách cài đặt và sau đó đặt lại email MAILTO=""sẽ vô hiệu hóa việc gửi bất kỳ email nào.

Thí dụ

MAILTO=""
* * * * *       root    /usr/local/sbin/mycommand.sh > /dev/null 2>&1

MAILTO="admin@somedom.com"
 * * * * *      root    /usr/local/sbin/myothercommand.sh

Tin nhắn bổ sung

Thông thường, bạn sẽ nhận được các loại tin nhắn /var/log/syslogsau:

Nov 11 08:17:01 manny CRON[28381]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

Đây chỉ là những thông báo đơn giản thông qua cron rằng một thư mục của cronjobs đã được thực thi. Thông báo này không có gì để làm trực tiếp với các công việc này, thay vào đó nó đến từ cronddaemon trực tiếp. Thực sự không có bất cứ điều gì bạn có thể làm về những điều này và tôi khuyến khích bạn không nên vô hiệu hóa những điều này, vì chúng có thể là cửa sổ duy nhất bạn có trong quá trình thực hiện crondthông qua nhật ký.

Nếu họ rất khó chịu với bạn, bạn luôn có thể hướng họ đến một tệp nhật ký thay thế để đưa họ ra khỏi /var/log/syslogtệp của bạn , thông qua /etc/syslog.conftệp cấu hình cho syslog.


@ rubo77 - bạn có thể đưa ra một ví dụ? Tôi cần xem những gì không hoạt động với cái này. Googling biến này lên như là câu trả lời: cyberciti.biz/faq/disable-the-mail-alert-by-crontab-command
SLM

Điều này hoạt động cho tất cả đầu ra và email, nhưng nó vẫn tạo ra một dòng cho mỗi cuộc gọi cron trong / var / log / syslog
rubo77

@ rubo77 - đó là những gì tôi nghĩ bạn có thể đã hỏi về. Bạn không thể dừng những tin nhắn đó, chúng được tạo bởi chính daemon crond.
slm

@ rubo77 - Tôi nhận thức được việc thay đổi /etc/syslog.conf, tôi hầu như không coi đây là một sự thay thế. Điều đó sẽ chỉ thay đổi tập tin mà các bản ghi được đổ vào hoặc bạn hoàn toàn có thể vô hiệu hóa tất cả các thông điệp cron cùng nhau. Không có cách nào để làm những gì bạn muốn.
slm

1
@ rubo77 - cách duy nhất bạn sẽ có thể làm những gì bạn muốn là nếu bạn đặt grep -v ...sau khi gọi crond.
slm

10

có một kịch bản cần được thực hiện mỗi phút. Vấn đề là cron đang đăng nhập vào / var / log / syslog mỗi lần nó thực thi. Tôi cuối cùng đã thấy lặp lại thông điệp mà nó đã được lặp đi lặp lại trong / var / log / syslog

Vì không có gì bạn làm dường như ngăn chặn điều này, nên đáng để hỏi: chính xác kịch bản này là gì và chính xác thông điệp bạn nhìn thấy trong syslog là gì?

Nếu đề xuất của slm không hoạt động, điều này là do một cái gì đó đang đăng nhập vào syslog trực tiếp - hoặc là cron, dường như được ngụ ý trong một số bình luận của bạn, hoặc nếu không thì quá trình được điều hành bởi cron. Tin nhắn được gửi tới syslog không đến từ stdin hoặc stderr, vì vậy 2>&1&>sẽ không có ích.

Có thể có một cách để định cấu hình hành vi của ứng dụng được đề cập, ngoại trừ chúng tôi không biết nó là gì.

Chắc chắn có một cách để cấu hình hầu hết các triển khai nhật ký hệ thống hiện đại (có một số) để lọc các thông điệp rất cụ thể. Ví dụ: nếu có một thẻ duy nhất được sử dụng trong thông điệp tường trình, bạn có thể nhắm mục tiêu đó. Nhưng một lần nữa, vì chúng tôi không biết gì về thông điệp cụ thể, hoặc bạn sử dụng syslogd nào, nên không có gì cụ thể có thể được đề xuất.

Quan điểm chung của tôi là nếu bạn không muốn chuyển hướng / lọc tin nhắn vì "điều này sẽ chuyển hướng tất cả các tin nhắn", thì bạn có thể tinh chỉnh kỹ thuật lọc. Chuỗi lỗi máy chủ mà bạn liên kết đến chỉ đề cập đến việc lọc theo cơ sở ( *.cron) - nhưng bạn có thể định cấu hình nhiều bộ lọc chuyên dụng hơn thế.


Cả Debian và Ubuntu đều có sẵn rsyslog . Trên debian 5+, nó là syslog mặc định, trên Ubuntu là một tùy chọn, vì vậy bạn sẽ phải cài đặt nó. Để tạo bộ lọc nhắm mục tiêu một số loại nội dung cụ thể, hãy đặt bộ lọc này gần đầu (nghĩa là trước bất kỳ quy tắc nào khác, nhưng sau cấu hình chung, tải mô-đun, v.v.) của /etc/rsyslog.conf. Cách tốt nhất để làm điều này không phải là chỉnh sửa rsyslog.confchính nó, mà là tạo một tệp trong /etc/rsyslog.conf.d/thư mục, với tên bắt đầu bằng hai chữ số nhỏ hơn 50, tức là /etc/rsyslog.conf.d/15-my-filter.conf. Bạn có thể đặt một cái gì đó như thế này:

:msg, contains, "/usr/bin/w3m -no-cookie" /dev/null

Điều này sẽ gửi tin nhắn đến /dev/null(hoặc một nhật ký riêng nếu bạn thích). Tuy nhiên, tin nhắn vẫn sẽ được chuyển qua các quy tắc tiếp theo gửi nó đến /var/log/syslog. Để ngăn chặn điều đó:

& stop

Ngay sau đó là dòng khác. Điều này sẽ ném đi bất cứ thứ gì phù hợp với quy tắc trước đó. Hoặc, đối với quy tắc một dòng, bạn chỉ có thể thêm stopvào cuối dòng quy tắc đó.

Bạn phải khởi động lại rsyslogdsau khi thay đổi cấu hình, (ví dụ: trên các hệ thống systemd systemctl restart rsyslog):

kill -HUP $(cat /var/run/rsyslogd.pid)

HUP khiến daemon tự khởi động lại.


Đối với rsyslog ~hiện không được chấp nhận và nên được thay thế bằng stop. Ngoài ra vị trí trong các rsyslogd.confvấn đề tập tin. Vì vậy, đối với rsyslog tôi chỉ đơn giản là sử dụng :msg, contains, "/usr/bin/w3m -no-cookie" stop. Và sau đó khởi động lại sudo systemctl restart rsyslog.
Frank Breitling

4

Thay đổi /etc/default/cron

# Or, to log standard messages, plus jobs with exit status != 0:
# EXTRA_OPTS='-L 5'
#
# For quick reference, the currently available log levels are:
#   0   no logging (errors are logged regardless)
#   1   log start of jobs
#   2   log end of jobs
#   4   log jobs with exit status != 0
#   8   log the process identifier of child process (in all logs)
#
EXTRA_OPTS="-L 0"

Theo mặc định, EXTRA_OPTSdòng là""


2

Chuyển hướng để /dev/nullẩn đầu ra từ lệnh. Nếu bạn không làm điều này thì cron sẽ gửi đầu ra cho bạn. Đầu ra từ lệnh không bao giờ kết thúc trong nhật ký hệ thống (ít nhất là không phải do cron đang làm).

Việc chuyển hướng đầu ra sang /dev/null, đặc biệt là đầu ra lỗi thường là một ý tưởng tồi : nếu có sự cố xảy ra, bạn sẽ không có bất kỳ thông tin nào để chẩn đoán sự cố. Nếu bạn không muốn nhận thư, hãy chuyển hướng đến tệp nhật ký.

Không ai trong số này có liên quan đến vấn đề của bạn tuy nhiên. Thông điệp bạn trích dẫn là từ chính cron. Cron viết một mục nhật ký mỗi khi nó chạy một công việc. Không có triển khai cron mà tôi thấy cho phép bạn sử dụng các cấu hình ghi nhật ký khác nhau cho các công việc khác nhau.

Nếu bạn muốn bỏ qua một số công việc, tùy chọn duy nhất của bạn là áp dụng lọc văn bản cho các thông điệp tường trình trong trình nền syslog. Tiêu chuẩn thực tế cho lọc syslog là chạy rsyslog (có thể hoặc không thể là mặc định trên hệ thống của bạn) dưới dạng daemon syslog. Xem câu trả lời của goldilocks để biết cách lọc ra lệnh đặc biệt này.

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.