it-swarm-vi.com

Lỗi cron được ghi ở đâu?

Nếu tôi thiết lập cron công việc không chính xác, chúng dường như thất bại trong âm thầm. Tôi nên tìm một bản ghi lỗi ở đâu để hiểu những gì đã sai?

182
Brian Lyttle

Như những người khác đã chỉ ra, cron sẽ gửi email cho bạn đầu ra của bất kỳ chương trình nào nó chạy (nếu có bất kỳ đầu ra nào). Vì vậy, nếu bạn không nhận được bất kỳ đầu ra nào, về cơ bản có ba khả năng:

  1. crond thậm chí không thể khởi động Shell để chạy chương trình hoặc gửi email
  2. crond gặp sự cố khi gửi thư đầu ra hoặc thư bị mất.
  3. chương trình không tạo ra bất kỳ đầu ra nào (bao gồm các thông báo lỗi)

Trường hợp 1. rất khó xảy ra, nhưng một cái gì đó nên được viết trong nhật ký cron. Cron có một cơ sở nhật ký hệ thống dành riêng, vì vậy bạn nên xem qua /etc/syslog.conf (Hoặc tệp tương đương trong bản phân phối của bạn) để xem nơi gửi tin nhắn của cơ sở cron. Các điểm đến phổ biến bao gồm /var/log/cron, /var/log/messages/var/log/syslog.

Trong trường hợp 2., bạn nên kiểm tra nhật ký trình nền của người gửi thư: các thư từ trình nền Cron thường xuất hiện dưới dạng từ [email protected]. Bạn có thể sử dụng một dòng MAILTO=... Trong tệp crontab để cron gửi email đến một địa chỉ cụ thể, điều này sẽ giúp dễ dàng hơn trong việc ghi nhật ký trình nền của người gửi thư. Ví dụ:

[email protected]
00 15 * * *  echo "Just testing if crond sends email"

Trong trường hợp 3., bạn có thể kiểm tra xem chương trình có thực sự chạy hay không bằng cách nối thêm một lệnh khác có hiệu lực mà bạn có thể dễ dàng kiểm tra: ví dụ:

00 15 * * * /a/command; touch /tmp/a_command_has_run

vì vậy bạn có thể kiểm tra xem crond có thực sự chạy thứ gì đó hay không bằng cách xem thời gian của /tmp/a_command_has_run.

116
Riccardo Murri

Bạn luôn có thể gửi đầu ra công việc một cách rõ ràng đến một tệp nhật ký:

0 8 * * * /usr/local/bin/myjob > /var/log/myjob.log 2>&1

Hãy nhớ rằng điều này sẽ thay thế hành vi thư đã được đề cập trước đó, bởi vì bản thân crond sẽ không nhận được bất kỳ đầu ra nào từ công việc. Nếu bạn muốn giữ hành vi đó, bạn nên xem qua tee (1).

54
codehead

Nếu bạn không nhìn thấy thư, bạn có thể đang spam root @ yourcompany với các lỗi có thể gây khó chịu cho những người sử dụng tài khoản đó để theo dõi. Thay vào đó, hãy thử gửi đầu ra tới Syslog:

*/5 * * * * yourcronjob 2>&1 | /usr/bin/logger -t yourtag

Sau đó, đợi cronjob chạy và tìm lỗi trong/var/log/message (hoặc /var/log/user.log trên một số hệ thống).

Điều này hoạt động rất tốt cho các thông báo lỗi chỉ dài 1-2 dòng, chẳng hạn như "yourcronjob: lệnh không tìm thấy". Nó cũng sử dụng cơ sở hạ tầng syslog hiện tại của bạn (Logrotation, syslogging trung tâm, Splunk, v.v.) Nó cũng làm giảm thư rác email đến root.

Nó có thể không phải là một giải pháp tốt nếu cronjob của bạn tạo ra hàng trăm dòng đầu ra.

44
Stefan Lasiewski

Bạn sẽ nhận được email từ crond khi công việc không chạy hoặc khi công việc trả về mã thoát không khác. Hãy thử gõ:

$ mailx

tại lệnh Nhắc.

mailx(1) là chương trình đọc thư cơ bản trên hầu hết mọi hệ thống Unixlike. Nó rất nguyên thủy theo tiêu chuẩn hiện đại, nhưng bạn có thể tin tưởng vào nó luôn luôn có sẵn. Khác, các tác nhân thư tốt hơn có thể có sẵn, nhưng có đủ chúng mà bạn không bao giờ biết cái nào được cài đặt trên một số máy ngẫu nhiên mà bạn đang sử dụng.

Lưu ý rằng trừ khi bạn đã cấu hình hệ thống của mình dưới dạng máy chủ email Internet, hệ thống con thư này chỉ được sử dụng trong máy. Bạn có thể gửi email đến và nhận từ những người dùng khác trên máy, nhưng bạn không thể gửi email ra thế giới và email từ thế giới bên ngoài chắc chắn sẽ không thể đến máy của bạn.

8
Warren Young

Cấu hình cron mặc định sẽ gửi cho bạn một thư có đầu ra của chương trình. Nếu điều này không thành công, bạn có thể thử gói chương trình bị lỗi của mình trong tập lệnh Shell để đảm bảo rằng chương trình không bị lỗi và bạn có thể đăng nhập thêm.

Đây là một thiết lập cấu hình trên một số triển khai cron.

8
miguel.de.icaza

Cron ghi thông tin cơ bản vào /var/log/messages, nhưng gửi bất kỳ đầu ra chương trình nào cho người dùng đang gọi.

5
Hemant

Tôi tình cờ phát hiện ra chủ đề này vài năm trước gặp phải những vấn đề tương tự và mới đây tôi đã bắt gặp một giải pháp cho các trường hợp được đề cập ở trên của Ricardo. Việc thiếu email rất khó phát hiện (như bạn đã đề cập) và bạn chắc chắn không muốn spam email gốc @ email của bạn. Nếu quan tâm hãy xem deadmanssnitch.com. . Công cụ này dường như để giải quyết các trường hợp đã nói ở trên. Có vẻ khá đơn giản để sử dụng, chỉ cần thêm một chút mã mà công cụ cung cấp cho bạn vào cronjob của bạn. Nếu công việc của bạn không chạy ở một nội bộ được chỉ định, bạn sẽ được cảnh báo. Nếu công việc của bạn bắt đầu chạy lại, bạn cũng sẽ được cảnh báo.

2
ss_jt

Tôi sử dụng vixie-cron, Vì vậy tôi không biết điều này có áp dụng cho mọi thứ không. Nhưng tôi có tệp dead.letter Chứa tất cả đầu ra của công việc.

Trong thư mục /root/ Tôi có crons.cron Mà tôi đặt làm crontab của mình bằng cách chạy crontab /root/crons.cron. dead.letter Cũng sẽ được tạo trong /root/.

Chỉnh sửa Tôi chỉ Google dead.letter, Và đó là một thư không thể gửi được. Nó không có gì để làm với cron rõ ràng. Nếu bạn không thiết lập thư chính xác (như tôi), bạn sẽ có tệp.

1
jonescb

Một mẹo hữu ích khác là xem kịch bản nào được thực thi.

Điều này được thực hiện với run-parts -v --test /etc/cron.hourly/

> /etc/cron.hourly//logrotate

Nếu tập lệnh của bạn không hiển thị, nó sẽ không được thực thi.

Btw này chỉ hoạt động cho các tập lệnh được cài đặt trong /etc/cron.hourly danh mục. Nó không hiển thị cho bạn các mục được đặt trong crontab của bạn.

1
RickyA

Đối với người mới, đây có thể là một nỗi đau để gỡ lỗi. Hãy chắc chắn không trao đổi các giá trị phút và giờ. Phút đến trước, rồi giờ. Khi bạn cung cấp các giá trị nhỏ hơn 12 cho mỗi cái, nó sẽ chấp nhận chúng nhưng có thể không hoạt động như mong đợi hoặc hoàn toàn không.

0
Michael Woyo