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


170

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

Câu trả lời:


106

Như những người khác đã chỉ ra, cronsẽ 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 khó khăn 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ý riê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ông báo từ trình nền Cron thường xuất hiện như từ root@yourhost. Bạn có thể sử dụng một MAILTO=...dòng trong tệp crontab để cron gửi email đến một địa chỉ cụ thể, điều này sẽ giúp bạn 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ụ:

MAILTO=my.offsite.email@example.org
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đã thực sự chạy một cái gì đó bằng cách nhìn vào thời gian của /tmp/a_command_has_run.


3
Những "email" này có đi trong một tập tin không? Tôi đang sử dụng lưu trữ web được chia sẻ và không nghĩ rằng họ biết nơi gửi email cho tôi.
Nathan Long

3
Tôi đánh giá cao lời khuyên trong trường hợp 3 để kiểm tra xem lệnh có đang chạy hay không. Trong trường hợp của tôi, cron không chạy công việc của tôi vì gần đây tôi đã thay đổi múi giờ của máy chủ và cần khởi động lại máy chủ cron để nó đánh giá thời gian của cron trong múi giờ thích hợp.
Nathan

1
Tùy thuộc vào đại lý chuyển thư của bạn, bạn cũng có thể tìm thấy các thư chưa được gửi trong một tệp được gọi dead.lettertrong thư mục gốc hoặc thư mục gốc của người dùng tương ứng.
Dario Seidl

43

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).


9
Tại sao không sử dụng >>thay vì >, vì vậy bạn không ghi đè lên tệp nhật ký mỗi lần?
Chris

Chắc chắn rồi! Bất kỳ loại chuyển hướng I / O nào cũng sẽ làm được, ngay cả | /usr/bin/loggerkhi bạn muốn, như gợi ý khéo léo của Stefan. Chọn chất độc của bạn: tldp.org/LDP/abs/html/io-redirection.html
codehead

cron đã tạo tệp nhật ký này myjob.logvới kích thước 0 như mong đợi, nhưng nó đã ghi vào tệp khác, tôi có thể thay đổi cài đặt này ở đâu?
Kế toán م

42

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.


8

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.


7

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

$ mailx

tại dấu nhắc lệnh.

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.


5

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 gọi.


Không có /var/log/messagestrên máy chủ Ubuntu của tôi ( 4.4.0-128-generic #154-Ubuntu SMP). Bất cứ ý tưởng tại sao? Tôi đã có một vài công việc định kỳ được xác định trong rootcrontab trong nhiều tháng (ví dụ apt autoremove), nhưng dường như không có công việc nào được thực hiện.
Dan Dascalescu

2

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.


1

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

Trong /root/thư mục của tôi, tôi có crons.croncái mà tôi đặt là crontab của mình bằng cách chạy crontab /root/crons.cron. dead.lettersẽ được tạo trong /root/là tốt.

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.


0

Đố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.


2
Bạn nói đúng, nhưng tôi không chắc điều này thực sự trả lời được câu hỏi.
roaima
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.