Làm thế nào để đăng nhập công việc cron?


218

Tôi muốn biết làm thế nào tôi có thể thấy chính xác những công việc định kỳ đang làm trên mỗi lần thực hiện. Các tệp nhật ký nằm ở đâu? Hoặc tôi có thể gửi đầu ra đến email của tôi? Tôi đã đặt địa chỉ email để gửi nhật ký khi công việc định kỳ chạy nhưng tôi chưa nhận được gì.


Câu trả lời:


347
* * * * * myjob.sh >> /var/log/myjob.log 2>&1

sẽ ghi lại tất cả đầu ra từ công việc định kỳ vào /var/log/myjob.log

Bạn có thể sử dụng mailđể gửi email. Hầu hết các hệ thống sẽ gửi cronđầu ra công việc chưa được xử lý qua email đến root hoặc người dùng tương ứng.



5
Điều gì có thể là vấn đề nếu logfile này không bao giờ được tạo ra?
kẹp

10
FWIW, nếu bạn muốn cả hai stderrstdouttrong nhật ký, thì 2>&1phải đến sau khi có sự quyết định:myjob.sh >> /var/log/myjob.log 2>&1
Dan Lecocq

2
Làm thế nào để chèn YYYY-MM-DD_hh-mm-secvào tên tệp đầu ra, sao cho mỗi tên tệp khác nhau và được giữ mà không cần viết lại?
Danijel

6
@Danijel serverfault.com/a/117365/193377 0 0 * * * /some/path/to/a/file.php> $ HOME / date +\%Y\%m\%d\%H\%M\%S-cron.log 2> & 1
AnneTheAgile

61

Theo mặc định, ghi nhật ký cron vào / var / log / syslog để bạn có thể xem các mục liên quan đến cron bằng cách sử dụng:

grep CRON /var/log/syslog

https://askubfox.com/questions/56683/where-is-the-cron-crontab-log


2
Trên Ubuntu 12.04, mặc định không có .log, tức là / var / log / syslog
tishma

5
sử dụng journalctl | grep crontrên các hệ thống systemd
Microsoft Linux TM

2
/var/log/crontrên AWS Linux AMI.
Jonathan

2
hoặcsudo journalctl -u cron
Gianfranco P.

2
Trường hợp chính xác cronđang được đăng nhập là rất phụ thuộc hệ thống. Có một câu trả lời riêng với các chi tiết về cách các đích ghi nhật ký khác nhau được định cấu hình trên các hệ thống Linux (hay chính xác hơn là các hệ thống sử dụng syslog). Các hệ thống khác có thể có một cách khác để cấu hình những thứ này.
tripleee

10

Đây là mã của tôi:

* * * * * your_script_fullpath >> your_log_path 2>&1

">>" có nghĩa là nối dữ liệu vào fileright? "2> & 1" nghĩa là gì, đầu ra đầy đủ có lỗi, phải không?
Nullpulum

3
Các câu hỏi chuyển hướng cơ bản được kiểm tra tốt nhất trong hướng dẫn. Ngoài ra còn có một số liệu potrzebie của các câu hỏi trùng lặp về các toán tử này ở đây trên Stack Overflow. Nhưng vâng, đại khái; >>nối và 2>&1nói để gửi lỗi tiêu chuẩn đến cùng một nơi với đầu ra tiêu chuẩn.
tripleee

10

Có ít nhất ba loại ghi nhật ký khác nhau:

  1. Việc ghi nhật ký TRƯỚC KHI chương trình được thực thi, chỉ ghi nhật ký NẾU cronjob TRIED để thực thi lệnh. Cái đó được đặt trong / var / log / syslog, như đã được đề cập bởi @Matthew Lock.

  2. Việc ghi nhật ký lỗi SAU chương trình đã cố thực thi, có thể được gửi đến email hoặc tệp, như được đề cập bởi @Spliffster. Tôi thích đăng nhập vào một tập tin, bởi vì với email THÌ bạn có một nguồn vấn đề MỚI và kiểm tra xem việc gửi và nhận email có hoạt động hoàn hảo không. Đôi khi, đôi khi không. Ví dụ: trong một máy tính để bàn phổ biến đơn giản mà bạn không quan tâm đến việc định cấu hình smtp, đôi khi bạn sẽ thích đăng nhập vào một tệp:

     * * * *  COMMAND_ABSOLUTE_PATH > /ABSOLUTE_PATH_TO_LOG 2>&1
    
    • Tôi cũng sẽ xem xét việc kiểm tra các quyền của / ABSOLUTE_PATH_TO_LOG và chạy lệnh từ quyền của người dùng đó. Chỉ để xác minh, trong khi bạn kiểm tra xem nó có thể là nguồn gây ra sự cố không.
  3. Việc ghi nhật ký chương trình, với việc xử lý lỗi và ghi nhật ký riêng cho mục đích theo dõi.

Có một số nguồn phổ biến của các vấn đề với cronjobs: * POLOLUTE PATH của nhị phân được thực thi. Khi bạn chạy nó từ shell của mình, nó có thể hoạt động, nhưng quá trình cron dường như sử dụng một môi trường khác, và do đó nó không luôn tìm thấy nhị phân nếu bạn không sử dụng đường dẫn tuyệt đối. * LIBRARIES được sử dụng bởi nhị phân. Nó ít nhiều giống với điểm trước đó, nhưng hãy đảm bảo rằng, nếu chỉ cần đặt TÊN lệnh, đang đề cập chính xác đến nhị phân sử dụng cùng một thư viện, hoặc tốt hơn, hãy kiểm tra xem nhị phân bạn đang tham chiếu với đường dẫn tuyệt đối giống như bạn giới thiệu khi bạn sử dụng bàn điều khiển trực tiếp. Các nhị phân có thể được tìm thấy bằng cách sử dụng lệnh định vị, ví dụ:

$locate python

Hãy chắc chắn rằng nhị phân bạn sẽ giới thiệu, giống hệt như nhị phân bạn đang gọi trong vỏ của bạn, hoặc chỉ cần kiểm tra lại trong vỏ của bạn bằng cách sử dụng đường dẫn tuyệt đối mà bạn dự định đặt vào cronjob.

  • Một nguồn phổ biến khác của vấn đề là cú pháp trong cronjob. Hãy nhớ rằng có những ký tự đặc biệt bạn có thể sử dụng cho danh sách (dấu phẩy), để xác định phạm vi (dấu gạch ngang -), để xác định gia tăng của phạm vi (dấu gạch chéo), v.v. Hãy xem: http://www.softpanorama.org/Utilities/ cron.shtml

8

Trên Ubuntu, bạn có thể kích hoạt cron.log tệp để chỉ chứa các mục CRON.

Bỏ ghi chú dòng đề cập crontrong /etc/rsyslog.d/50-default.conftệp:

#  Default rules for rsyslog.
#

#                       For more information see rsyslog.conf(5) and /etc/rsyslog.conf

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                          /var/log/cron.log

Lưu và đóng tệp và sau đó khởi động lại rsyslogdịch vụ:

sudo systemctl restart rsyslog

Bây giờ bạn có thể thấy các mục nhật ký cron trong tệp riêng của mình:

sudo tail -f /var/log/cron.log

Đầu ra mẫu:

Jul 18 07:05:01 machine-host-name CRON[13638]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)

Tuy nhiên, bạn sẽ không thấy thêm thông tin về những tập lệnh nào thực sự chạy bên trong /etc/cron.dailyhoặc /etc/cron.hourly, trừ khi những tập lệnh đó xuất trực tiếp ra cron.log (hoặc có thể cho một số tệp nhật ký khác).

Nếu bạn muốn xác minh xem một crontab đang chạy và không phải tìm kiếm nó trong cron.loghoặc syslog, hãy tạo một crontab chuyển hướng đầu ra thành một tệp nhật ký bạn chọn - đại loại như:

# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log 2>&1

Các bước được thực hiện từ: https://www.cyberciti.biz/faq/howto-create-cron-log-file-to-log-crontab-logs-in-ub Ubuntu-linux /


Ubuntu 16.04 không hiển thị bất kỳ nhật ký cron nào và thông tin này đã đánh lừa.
pojda

5

cron đã gửi đầu ra tiêu chuẩn và lỗi tiêu chuẩn của mọi công việc mà nó chạy qua thư cho chủ sở hữu của công việc định kỳ.

Bạn có thể sử dụng MAILTO=recipienttrong crontabtệp để gửi email đến một tài khoản khác.

Để làm việc này, bạn cần phải có thư hoạt động đúng. Việc gửi đến hộp thư cục bộ thường không phải là vấn đề (thực tế, rất có thể làls -l "$MAIL" sẽ tiết lộ rằng bạn đã nhận được một số) nhưng việc đưa nó ra khỏi hộp và ra internet đòi hỏi MTA (Postfix, Sendmail, bạn có gì) được cấu hình đúng để kết nối với thế giới.

Nếu không có đầu ra, sẽ không có email nào được tạo.

Một cách sắp xếp phổ biến là chuyển hướng đầu ra sang một tệp, trong trường hợp đó, trình nền cron sẽ không thấy công việc trả về bất kỳ đầu ra nào. Một biến thể là chuyển hướng đầu ra tiêu chuẩn sang một tệp (hoặc viết tập lệnh để nó không bao giờ in bất cứ thứ gì - có lẽ nó lưu kết quả trong cơ sở dữ liệu hoặc thực hiện các tác vụ bảo trì đơn giản là không xuất bất cứ thứ gì?) Và chỉ nhận được email nếu có là một thông báo lỗi.

Để chuyển hướng cả hai luồng đầu ra, cú pháp là

42 17 * * * script >>stdout.log 2>>stderr.log

Lưu ý cách chúng ta chắp thêm (gấp đôi >>) thay vì ghi đè, để bất kỳ đầu ra nào của công việc trước đó không bị thay thế bởi công việc tiếp theo.

Như được đề xuất trong nhiều câu trả lời ở đây, bạn có thể gửi cả hai luồng đầu ra vào một tệp; thay thế chuyển hướng thứ hai bằng 2>&1"lỗi tiêu chuẩn sẽ xuất hiện ở bất cứ nơi nào có đầu ra tiêu chuẩn". (Nhưng tôi không đặc biệt tán thành cách làm này. Điều này chủ yếu có ý nghĩa nếu bạn không thực sự mong đợi bất cứ điều gì về đầu ra tiêu chuẩn, nhưng có thể đã bỏ qua điều gì đó, có lẽ đến từ một công cụ bên ngoài được gọi từ tập lệnh của bạn.)

croncác công việc chạy trong thư mục nhà của bạn, vì vậy bất kỳ tên tệp tương đối nào cũng phải liên quan đến điều đó. Nếu bạn muốn viết bên ngoài thư mục chính của mình, rõ ràng bạn cần phải đảm bảo riêng bạn có quyền truy cập ghi vào tệp đích đó.

Một phản mẫu phổ biến là chuyển hướng mọi thứ đến /dev/null(và sau đó yêu cầu Stack Overflow giúp bạn tìm ra lỗi đã xảy ra khi có gì đó không hoạt động; nhưng chúng ta cũng không thể thấy đầu ra bị mất!)

Từ trong tập lệnh của bạn, đảm bảo tách riêng đầu ra (kết quả thực tế, lý tưởng ở dạng có thể đọc được bằng máy) và chẩn đoán (thường được định dạng cho người đọc). Trong một kịch bản shell,

echo "$results"  # regular results go to stdout
echo "$0: something went wrong" >&2

Một số nền tảng (và ví dụ GNU Awk) cho phép bạn sử dụng tên tệp /dev/stderrcho các thông báo lỗi, nhưng điều này không đúng cách; trong Perl, warndiein lỗi tiêu chuẩn; trong Python, viết sys.stderrhoặc sử dụng logging; trong Ruby, hãy thử $stderr.puts. Cũng lưu ý cách thông báo lỗi nên bao gồm tên của tập lệnh tạo ra thông báo chẩn đoán.


1

Trong trường hợp bạn đang chạy một số lệnh với sudo, nó sẽ không cho phép nó. Sudo cần một tty.


4
Điều này cũng phụ thuộc vào sudocấu hình. Những thứ cần chạy mà không có cách cung cấp mật khẩu nên được cấu hình NOPASSWD:trong sudoerscấu hình của bạn .
tripleee

0

Nếu bạn vẫn muốn kiểm tra công việc định kỳ của mình, bạn nên cung cấp tài khoản email hợp lệ khi đặt công việc Cron trong cPanel.

Khi bạn chỉ định một email hợp lệ, bạn sẽ nhận được đầu ra của công việc định kỳ được thực thi. Do đó, bạn sẽ có thể kiểm tra nó và đảm bảo mọi thứ đã được thực hiện chính xác. Lưu ý rằng bạn sẽ không nhận được email nếu không có đầu ra từ lệnh cron job.

Xin lưu ý rằng bạn sẽ nhận được email cho mỗi công việc định kỳ đã thực hiện. Điều này có thể làm ngập hộp thư đến của bạn trong trường hợp con chuột của bạn chạy quá thường xuyên

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.