Nếu tôi thiết lập cron
cô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?
Nếu tôi thiết lập cron
cô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:
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:
crond
thậm chí không thể khởi động shell để chạy chương trình hoặc gửi emailcrond
gặp khó khăn khi gửi thư đầu ra, hoặc thư bị mất.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
và /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
.
dead.letter
trong thư mục gốc hoặc thư mục gốc của người dùng tương ứng.
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).
>>
thay vì >
, vì vậy bạn không ghi đè lên tệp nhật ký mỗi lần?
| /usr/bin/logger
khi 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
myjob.log
vớ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?
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.
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.
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á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.
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.
/var/log/messages
trê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 root
crontab 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.
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.
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.letter
tậ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.cron
cái mà tôi đặt là crontab của mình bằng cách chạy crontab /root/crons.cron
. dead.letter
sẽ đượ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.
Đố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.