Tại sao hủy đăng ký lệnh là không làm việc?

Thường, crontab kịch bản không được thực hiện trên sắp xếp hay như mong đợi. Có rất nhiều lý do cho điều đó:

  1. sai hủy đăng ký hiệu
  2. quyền vấn đề
  3. biến môi trường

Cộng đồng này wiki nhằm mục đích để tổng hợp lý do hàng đầu cho crontab kịch bản không được thực hiện như dự kiến. Viết mỗi lý do trong một câu trả lời riêng biệt.

Hãy đưa một trong những lý do cho mỗi câu trả lời - chi tiết về lý do tại sao nó không được thực thi và sửa chữa(es) cho rằng một lý do.

Xin vui lòng chỉ viết bài cụ thể vấn đề, ví dụ như lệnh xử như mong đợi từ vỏ nhưng thực hiện sai lầm bởi định kỳ.

Môi trường khác nhau

Định kỳ chuyền một tập tối thiểu của môi trường biến của việc làm. Thấy sự khác biệt, thêm một giả công việc như thế này:

>* * * * * m /không/m.ra

Đợi /tmp/env.output để được tạo ra, sau đó bỏ công việc nữa. Bây giờ hãy so sánh các nội dung của /tmp/env.output với các sản phẩm của env chạy thường xuyên của thiết bị đầu cuối.

Một phổ biến "được rồi" đây là những PATH biến môi trường khác nhau. Có lẽ bạn định kỳ kịch bản, sử dụng sự chỉ huy somecommand tìm thấy trong /opt/someApp/bin mà bạn đã thêm vào PATH trong /etc/environment? định kỳ, bỏ qua PATH từ tập tin đó, vậy runnning somecommand từ kịch bản của bạn sẽ thất bại khi chạy với định kỳ, nhưng làm việc khi chạy trong một thiết bị đầu cuối. Nó đáng chú ý đó biến từ /etc/environment sẽ được thông qua ngày cho việc làm định kỳ, chỉ cần không phải là biến định kỳ đặc biệt bộ riêng của mình, như PATH.

Để làm được việc đó, chỉ cần thiết PATH biến ở đầu của kịch bản. Ví dụ.

#!/bin/bashPATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin# rest of script follows

Một số người thích, chỉ để sử dụng tuyệt đối đường dẫn đến tất cả các lệnh thay thế. Tôi đề nghị chống lại điều đó. Hãy xem những gì sẽ xảy ra nếu anh muốn chạy kịch bản khác nhau, hệ thống và trên đó hệ thống, lệnh là trong /opt/someAppv2.2/bin thay vào đó. Anh sẽ phải đi qua cả kịch bản thay thế /opt/someApp/bin với /opt/someAppv2.2/bin thay vì chỉ làm một sửa trên dòng đầu tiên của kịch bản.

Bạn cũng có thể thiết lập ĐƯỜNG biến trong hủy đăng ký tập tin, mà sẽ áp dụng cho tất cả định kỳ công việc. Ví dụ.

PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin15 1 * * * backupscript --incremental /home /root

Hàng đầu của tôi ghi chú: Nếu bạn quên thêm một dòng mới vào cuối crontab tập tin. Nói cách khác, hủy đăng ký tập tin nên kết thúc với một dòng trống.

Dưới đây là các phần có liên quan trong những người đàn ông trang cho vấn đề này (man crontab sau đó bỏ qua tới kết thúc):

   Although cron requires that each entry in a crontab end  in  a  newline   character,  neither the crontab command nor the cron daemon will detect   this error. Instead, the crontab will appear to load normally. However,   the  command  will  never  run.  The best choice is to ensure that your   crontab has a blank line at the end.   4th Berkeley Distribution      29 December 1993               CRONTAB(1)

Lịch trình không hoạt động. Tôi thực sự làm hỏng này với một vài tháng trước đây.

Loại:

pgrep cron 

Nếu bạn thấy không có số (tức là định kỳ chính của giám sát), sau đó định kỳ được không chạy. sudo /etc/init.d/cron start có thể được sử dụng để bắt đầu tiến trình tự động.

EDIT: Chứ không phải là cách gọi khởi kịch bản qua /etc sao.d, sử dụng serviceutility, ví dụ như:

sudo service cron start

EDIT: Cũng bạn có thể sử dụng systemctl trong Linux hiện đại, ví dụ như:

sudo systemctl start cron

Kịch bản tên trong cron.d/, cron.daily/, cron.hourly/ etc. nên không có dấu chấm (.), nếu không chạy bộ phận sẽ bỏ qua chúng.

Xem chạy bộ phận(8):

   If neither the --lsbsysinit option nor the --regex option is given then   the names must consist entirely of upper and lower case  letters,  dig‐   its, underscores, and hyphens.   If  the  --lsbsysinit  option  is given, then the names must not end in   .dpkg-old  or .dpkg-dist or .dpkg-new or .dpkg-tmp, and must belong  to   one  or more of the following namespaces: the LANANA-assigned namespace   (^[a-z0-9]+$);   the   LSB   hierarchical   and   reserved   namespaces   (^_?([a-z0-9_.]+-)+[a-z0-9]+$);  and  the  Debian cron script namespace   (^[a-zA-Z0-9_-]+$).

Vì vậy, nếu bạn có định kỳ kịch bản backup.sh, analyze-logs.pl trong cron.daily/ mục, anh sẽ tốt nhất để loại bỏ các mở rộng tên.

Trong nhiều trường định kỳ thực hiện lệnh sử dụng sh trong khi nhiều người cho rằng nó sẽ sử dụng bash.

Đề nghị để kiểm tra hoặc sửa cái này cho một thất bại lệnh:

  • Cố gắng chạy theo lệnh trong sh để xem nếu nó hoạt động:

    sh -c "mycommand"
  • Quấn chỉ huy trong một bash subshell để đảm bảo rằng nó được chạy trong bash:

    bash -c "mybashcommand"
  • Nói cho định kỳ để chạy tất cả các lệnh trong bash bởi thiết lập vỏ ở đầu của bạn hủy đăng ký:

    SHELL=/bin/bash
  • Nếu lệnh là một kịch bản, chắc chắn các kịch bản có một công việc:

    #!/bin/bash

Tôi đã có một số vấn đề với múi giờ. Định kỳ được chạy với tươi cài đặt múi giờ. Giải pháp là để khởi động tiến trình tự động:

sudo service cron restart

Tuyệt đối đường nên được sử dụng cho các kịch bản:

Ví dụ:, /bin/grep nên được sử dụng thay grep:

# m h  dom mon dow   command0 0 *  *  *  /bin/grep ERROR /home/adam/run.log &> /tmp/errors

Thay vì:

# m h  dom mon dow   command0 0 *  *  *  grep ERROR /home/adam/run.log &> /tmp/errors

Đây là đặc biệt là khó, bởi vì cùng một lệnh sẽ làm việc khi thực hiện từ vỏ. Lý do là cron không có cùng PATH biến môi trường như các người dùng.

Nếu bạn hủy đăng ký lệnh có một % biểu tượng trong đó, định kỳ cố gắng giải thích nó. Vì vậy, nếu bạn đang sử dụng bất kỳ lệnh với một % ở đó (như một dạng đặc điểm kỹ thuật ngày lệnh) bạn sẽ cần để thoát khỏi nó.

Đó và tốt khác vấn đề ở đây:
http://www.pantz.org/software/cron/croninfo.html

Định kỳ được gọi một kịch bản đó là không thực thi.

Bằng cách chạy chmod +x /path/to/script kịch bản trở nên thực thi và điều này sẽ giải quyết vấn đề này.

Nó cũng có thể là của người sử dụng mật khẩu đã hết hạn. Thậm chí gốc của mật khẩu có thể hết hạn. Bạn có thể tail -f /var/log/cron.log và bạn sẽ thấy định kỳ thất bại với khẩu hết hạn. Bạn có thể đặt mật khẩu để không bao giờ hết hạn bởi làm điều này: passwd -x -1 <username>

Trong một số hệ thống (Debian Chỉ) đăng nhập cho định kỳ được không kích hoạt mặc định. Trong /etc/rsyslog.tập tin hay /etc/rsyslog.d/50-mặc định.tập tin đường:

# cron.*                          /var/log/cron.log

nên được chỉnh sửa (sudo nano /etc/rsyslog.conf) không chú thích đến:

cron.*                          /var/log/cron.log

Sau đó, bạn cần phải khởi động lại rsyslog qua

/etc/init.d/rsyslog restart

hay

service rsyslog restart 

Nguồn: Cho phép hủy đăng ký đăng nhập Debian Linux

Trong một số hệ thống (Ubuntu) riêng đăng nhập tập tin cho định kỳ được không kích hoạt mặc định, nhưng định kỳ liên quan bản ghi được xuất hiện trong hệ thống tạo tập tin. Người ta có thể sử dụng

cat /var/log/syslog | grep cron -i

để xem bài liên quan tin nhắn.

Bạn phải đóng hủy đăng ký -e cho định kỳ để có ảnh hưởng đến. Ví dụ sử dụng tên tôi sửa các tập tin và sử dụng w để viết nó, nhưng trong công việc là không thêm để định kỳ cho đến khi tôi bỏ cũng được. Vì vậy, tôi sẽ không thấy người làm việc cho đến khi tôi :q cũng.

Tôi nghĩ cách tốt nhất để gỡ định kỳ được để kiểm tra hệ thống tạo và tìm thấy các vấn đề.

Trong trường hợp của tôi - email đã đi để tôi THƯ mục như vậy… kiểm tra trước khi bạn dành nhiều giờ trên lỗi :smiley:

Cúp điện

Xin vui lòng kiểm tra này cron - Script doesn't run via crontab but works fine standalone - Ask Ubuntu