Làm thế nào tôi có thể xem kết quả của công việc định kỳ của tôi?


Câu trả lời:


66

Kiểm tra xem các chương trình bạn chạy với cron có tệp nhật ký riêng không. Nếu họ không nhưng ghi đầu ra của họ vào đầu ra tiêu chuẩn, bạn có thể chuyển hướng chúng sang tệp hoặc gửi chúng cho bạn. Bên trong crontabs chuyển hướng vỏ tiêu chuẩn hoạt động.

Ví dụ: để chuyển hướng đầu ra lỗi some_job.shđến some_job.errvà loại bỏ đầu ra tiêu chuẩn (nghĩa là gửi nó đến /dev/null) thêm chuyển hướng sau vào crontab của bạn

 33 3 * * * /path/to/some_job.sh 1> /dev/null 2> /other/path/to/some_job.err

hoặc gửi nó cho bạn thay vào đó (nếu mailcó sẵn)

 33 3 * * * /path/to/some_job.sh 1> /dev/null 2>&1 | mail -s "cron output" you@example.org

Đây là cách tôi luôn giải quyết các vấn đề về bạn.
vật lý học

Đó có phải là ví dụ thứ hai đúng không? Nó sẽ không chuyển hướng mọi thứ đến /dev/null?
Timmmm

7
@Timmmm: Tôi làm việc. Đầu tiên, nó chuyển hướng tất cả mọi thứ từ some_job.shthiết bị xuất chuẩn đến /dev/nullvà chỉ sau thiết bị xuất chuẩn của nó đến thiết bị xuất chuẩn (hiện không còn gì nữa). Bằng cách đó, chỉ có stderr của nó kết thúc trong thiết bị xuất chuẩn và được truyền lại mail.
Benjamin Bannier

9

Hầu hết các trình nền cron trên các nền tảng mà tôi đã làm việc với việc tự động gửi email tiêu chuẩn / tiêu chuẩn của các công việc cron người dùng cho người dùng có công việc crontab đến từ đó. Tôi quên những gì xảy ra với toàn hệ thống (công việc cron không dành riêng cho người dùng từ / etc / crontab). Vấn đề là mọi người không phải lúc nào cũng thiết lập trình nền thư (nghĩa là Tác nhân chuyển thư (MTA) như sendmail, qmail hoặc postfix) trên hầu hết các hệ điều hành giống Unix. Vì vậy, các email đầu ra công việc định kỳ chỉ chết trong một địa phương thư mục mail ống chỉ ở đâu đó nếu họ thậm chí được rằng đến nay. Vì vậy, một câu trả lời có thể chỉ là kích hoạt trình nền thư của bạn và có thể đảm bảo rằng bạn có tệp ~ / .forward để chuyển tiếp thư cục bộ của bạn cùng với tài khoản email "thực" của bạn.

Nếu bạn muốn công việc của mình ghi vào các tệp nhật ký cụ thể, bạn có thể sử dụng chuyển hướng đầu ra tiêu chuẩn như @honk đề xuất hoặc giả sử công việc định kỳ của bạn là tập lệnh shell, bạn có thể có trình ghi nhật ký cuộc gọi tập lệnh (1) hoặc syslog (1) hoặc bất cứ công cụ dòng lệnh nào khác mà HĐH của bạn cung cấp để gửi tin nhắn tùy ý tới syslog. Sau đó, bạn có thể sử dụng các phương thức tích hợp trong hệ điều hành của mình để định cấu hình loại tin nhắn nào được ghi lại ở đâu, có lẽ bằng cách chỉnh sửa /etc/syslog.conf.

Hầu hết các công việc định kỳ của tôi đều gọi các tập lệnh bash mà tôi đã viết riêng cho mục đích bắt đầu bằng cron vì một lý do cụ thể. Trong đó, đặc biệt là khi ban đầu tôi viết và gỡ lỗi chúng, tôi muốn sử dụng "set -vx" của bash để làm cho hình thức mở rộng và mở rộng của mỗi dòng của tập lệnh shell được viết thành stdout trước khi nó được thực thi. Lưu ý rằng các tập lệnh shell bắt đầu từ cron được coi là shell không đăng nhập, không tương tác, vì vậy các tập lệnh khởi động shell tiêu chuẩn của bạn như .bashrc và .profile không chạy. Nếu bạn sử dụng bash và muốn bash để chạy tập lệnh khởi động, bạn phải xác định biến môi trường "BASH_ENV = / path / to / my / startup / script" trong crontab của bạn trước dòng bạn xác định công việc.


3
Chính xác. Người ta có thể sử dụng maillệnh để đọc tin nhắn từ dòng lệnh. Hoặc nhìn vào /var/spool/mail. Nhưng nếu bạn đã cài đặt postfix hoặc mailer khác ngoài sendmail tiêu chuẩn, một cách khác để đọc thư là cần thiết.
akostadinov

Tại sao chúng ta cần một đại lý dịch vụ thư chỉ cho việc này? mail -s "cron output" test@example.comchỉ hoạt động tốt: /
Martin Konecny

Trên CentOS, đầu ra cron của tôi được "gửi thư" đến / var / spool / mail. Xem nó bằng cách chạy less $MAILnếu bạn muốn xem đầu ra cron cho người dùng hiện tại hoặc less /var/spool/mail/rootnếu bạn muốn xem đầu ra cron cho các lệnh chạy dưới quyền root.
sffc

5

Các cron nhiệm vụ đang thực hiện có trách nhiệm đăng nhập riêng của họ.


2

Cách đơn giản nhất là chụp lỗi in và savem sau đó trong một tệp. Tôi có một cronjob gọi một dòng lệnh php, như thế này:

1 0 * * * php /pathOfMyApp/index.php controlName functionName> / pathOfMyApp / log / myErrorLog 2> & 1

Phần trước '>' đó là cronjob của tôi và sau '>' đó là phần chụp và lưu trong một tệp nằm trong thư mục nhật ký trong thư mục gốc của dự án của tôi, nhưng có thể ở nơi bạn muốn. Hãy cảnh giác: mỗi lần cronjob sẽ được gọi, anh ta sẽ ghi đè lên nhật ký cuối cùng. Bạn có thể sử dụng '>>' để ghi vào cuối tệp hiện có hoặc tìm kiếm lệnh đầu cuối 'cat'.

Nếu crontab của bạn sử dụng 'curl' hoặc 'wget' và tham khảo một liên kết, bạn có thể tìm kiếm trong / var / log / httpd / appName để truy cập nhật ký, nếu cron quay lại với 500 hoặc 400 thì có gì đó không đúng.

Cuối cùng, bạn cũng có thể kiểm tra / var / log / message.


1

Tôi nghĩ rằng chuyển hướng trong tệp cron có thể không phải là lựa chọn tốt nhất trong trường hợp này.

Thường thì bạn muốn ghi nhật ký speization cùng với kịch bản lệnh cron. Trong trường hợp này, tôi đề nghị như sau:

#!/bin/bash
exec &>> capture-log.txt
echo "Running cron-job foo at $(date)"
...
<rest of script>

Điều này sẽ nối đầu ra từ lệnh cron vào tệp Capture-log.txt.


1

Tôi thích nhận báo cáo e-mail về công việc định kỳ. Chỉ cần đặt

MAILTO=yourmail@domain.com

vào crontab và bạn sẽ nhận được email. Tất nhiên bạn phải cấu hình e-mail cho tài khoản của mình.


Tôi thấy điều này thường dễ nhất để bật và tắt để gỡ lỗi. Tôi thường chỉ sử dụng tên người dùng @ localhost cho địa chỉ email.
flickerfly
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.