Tại sao crontab của tôi không hoạt động và làm cách nào để khắc phục sự cố?


225

Đây là một câu hỏi Canonical về việc sử dụng cron & crontab.

Bạn đã được hướng dẫn ở đây vì cộng đồng khá chắc chắn rằng câu trả lời cho câu hỏi của bạn có thể được tìm thấy bên dưới. Nếu câu hỏi của bạn không được trả lời dưới đây thì câu trả lời sẽ giúp bạn thu thập thông tin sẽ giúp cộng đồng giúp bạn. Thông tin này nên được chỉnh sửa thành câu hỏi ban đầu của bạn.

Câu trả lời cho ' Tại sao crontab của tôi không hoạt động và làm cách nào để khắc phục sự cố? 'Có thể được nhìn thấy dưới đây. Điều này giải quyết cronhệ thống với crontab được tô sáng.


2
Đây là một bản sao lớn của Lý do tại sao crontab không hoạt động trên AskUbfox.
Dan Dascalescu

1
@DanDascalescu Có vẻ như Eric cần phải có thêm đại diện
Tôi là người ngu ngốc nhất

1
Tôi mới tham gia Server Fault SE (chỉ có 101 đại diện), nhưng rất thích đưa ra câu hỏi này -1 !! Có phải câu hỏi này chỉ được thực hiện để có được đại diện? @IamtheMostStoolPerson Hoàn toàn đồng ý với bạn ...
Holyprogrammer

Hệ tư tưởng phương Tây trong những người Padaw 13 tuổi này vừa là sách giáo khoa vừa chói mắt, giống như một siêu tân tinh. Để trả lời cả hai câu hỏi của bạn: có, tôi đã làm điều đó cho đại diện, và vâng, Eric cần phải có thêm danh tiếng. Tôi cần thêm bao nhiêu đại diện nữa ?? Hơn. youtu.be/IaDt9T7BF38?t=262
Eric Leschinski

Câu trả lời:


317

Cách khắc phục tất cả các vấn đề / tai nạn liên quan đến crontab của bạn (Linux)


Đây là một wiki cộng đồng , nếu bạn nhận thấy bất cứ điều gì không đúng với câu trả lời này hoặc có thêm thông tin thì hãy chỉnh sửa nó.


Đầu tiên, thuật ngữ cơ bản:

  • cron (8) là daemon thực thi các lệnh theo lịch trình.
  • crontab (1) là chương trình được sử dụng để sửa đổi tập tin người dùng crontab (5).
  • crontab (5) là một tệp cho mỗi người dùng có chứa các hướng dẫn cho cron (8).

Tiếp theo, giáo dục về cron:

Mỗi người dùng trên một hệ thống có thể có tệp crontab của riêng họ. Vị trí của tập tin crontab gốc và người dùng phụ thuộc vào hệ thống nhưng chúng thường nằm bên dưới /var/spool/cron.

Có một /etc/crontabtệp toàn hệ thống , /etc/cron.dthư mục có thể chứa các đoạn crontab cũng được đọc và hành động bởi cron. Một số bản phân phối Linux (ví dụ: Red Hat) cũng có /etc/cron.{hourly,daily,weekly,monthly}các thư mục, tập lệnh bên trong sẽ được thực thi mỗi giờ / ngày / tuần / tháng, với đặc quyền gốc.

root luôn có thể sử dụng lệnh crontab; người dùng thường xuyên có thể hoặc không thể được cấp quyền truy cập. Khi bạn chỉnh sửa tệp crontab bằng lệnh crontab -evà lưu nó, crond sẽ kiểm tra tính hợp lệ cơ bản nhưng không đảm bảo tệp crontab của bạn được định dạng chính xác. Có một tệp được gọi cron.denysẽ chỉ định người dùng nào không thể sử dụng cron. Vị cron.denytrí tệp phụ thuộc vào hệ thống và có thể bị xóa, điều này sẽ cho phép tất cả người dùng sử dụng cron.

Nếu máy tính không được bật hoặc crond daemon không chạy và ngày / giờ cho lệnh chạy đã trôi qua, crond sẽ không bắt kịp và chạy các truy vấn trong quá khứ.

crontab cụ thể, làm thế nào để xây dựng một lệnh:

Một lệnh crontab được đại diện bởi một dòng duy nhất. Bạn không thể sử dụng \để mở rộng một lệnh trên nhiều dòng. Dấu băm ( #) đại diện cho một nhận xét có nghĩa là bất cứ điều gì trên dòng đó bị bỏ qua bởi cron. Khoảng trắng hàng đầu và dòng trống được bỏ qua.

Hãy cẩn thận khi sử dụng dấu phần trăm ( %) trong lệnh của bạn. Trừ khi chúng được thoát, \%chúng được chuyển thành dòng mới và mọi thứ sau khi không thoát đầu tiên %được chuyển đến lệnh của bạn trên stdin.

Có hai định dạng cho tệp crontab:

  • Người dùng crontabs

    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
    # |  |  |  |  |
    # *  *  *  *  *   command to be executed
    
  • Hệ thống rộng /etc/crontab/etc/cron.dmảnh

    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
    # |  |  |  |  |
    # *  *  *  *  * user-name  command to be executed
    

Lưu ý rằng cái sau yêu cầu một tên người dùng. Lệnh sẽ được chạy như người dùng được đặt tên.

5 trường đầu tiên của dòng biểu thị thời gian khi lệnh sẽ được chạy. Bạn có thể sử dụng số hoặc nơi áp dụng tên ngày / tháng trong thông số thời gian.

  • Các trường được phân cách bằng dấu cách hoặc tab.
  • Dấu phẩy ( ,) được sử dụng để chỉ định danh sách, ví dụ 1,4,6,8, có nghĩa là chạy ở 1,4,6,8.
  • Phạm vi được chỉ định bằng dấu gạch ngang ( -) và có thể được kết hợp với các danh sách, ví dụ 1-3,9-12, có nghĩa là từ 1 đến 3 sau đó từ 9 đến 12.
  • /tự có thể được sử dụng để giới thiệu một bước, ví dụ 2/5, có nghĩa là bắt đầu từ 2 sau đó cứ sau 5 (2,7,12,17,22 ...). Họ không kết thúc quá khứ.
  • Dấu hoa thị ( *) trong trường biểu thị toàn bộ phạm vi cho trường đó (ví dụ: 0-59trường phút).
  • Phạm vi và các bước có thể được kết hợp, ví dụ: */2biểu thị bắt đầu ở mức tối thiểu cho trường có liên quan sau đó cứ sau 2 ví dụ 0 trong vài phút (0,2 ... 58), 1 cho tháng (1,3 ... 11), v.v.

Gỡ lỗi lệnh cron

Kiểm tra thư!

Theo mặc định, cron sẽ gửi bất kỳ đầu ra nào từ lệnh tới người dùng, nó đang chạy lệnh dưới dạng. Nếu không có đầu ra sẽ không có thư. Nếu bạn muốn cron gửi thư đến một tài khoản khác thì bạn có thể đặt biến môi trường MAILTO trong tệp crontab, vd

MAILTO=user@somehost.tld
1 2 * * * /path/to/your/command

Tự mình nắm bắt đầu ra

Bạn có thể chuyển hướng thiết bị xuất chuẩn và thiết bị xuất chuẩn vào một tệp. Cú pháp chính xác để chụp đầu ra có thể thay đổi tùy thuộc vào việc sử dụng cron shell nào. Dưới đây là hai ví dụ lưu tất cả đầu ra vào một tệp tại /tmp/mycommand.log:

1 2 * * * /path/to/your/command &>/tmp/mycommand.log
1 2 * * * /path/to/your/command >/tmp/mycommand.log 2>&1

Nhìn vào nhật ký

Cron ghi lại các hành động của nó thông qua syslog, mà (tùy thuộc vào thiết lập của bạn) thường đi đến /var/log/cronhoặc /var/log/syslog.

Nếu được yêu cầu, bạn có thể lọc các câu lệnh cron với vd

grep CRON /var/log/syslog 

Bây giờ chúng ta đã tìm hiểu những điều cơ bản về cron, nơi chứa các tệp và cách sử dụng chúng, hãy xem xét một số vấn đề phổ biến.

Kiểm tra xem cron có đang chạy không

Nếu cron không chạy thì các lệnh của bạn sẽ không được lên lịch ...

ps -ef | grep cron | grep -v grep

sẽ giúp bạn một cái gì đó như

root    1224   1  0 Nov16 ?    00:00:03 cron

hoặc là

root    2018   1  0 Nov14 ?    00:00:06 crond

Nếu không khởi động lại nó

/sbin/service cron start

hoặc là

/sbin/service crond start

Có thể có các phương pháp khác; sử dụng những gì distro của bạn cung cấp.

cron chạy lệnh của bạn trong một môi trường hạn chế.

Những biến môi trường có sẵn có khả năng rất hạn chế. Thông thường, bạn sẽ chỉ nhận được một vài biến xác định, chẳng hạn như $LOGNAME, $HOME, và $PATH.

Đặc biệt lưu ý PATHlà hạn chế /bin:/usr/bin. Phần lớn các sự cố "tập lệnh cron của tôi không hoạt động" là do đường dẫn hạn chế này gây ra . Nếu lệnh của bạn ở một vị trí khác, bạn có thể giải quyết điều này theo một số cách:

  1. Cung cấp đường dẫn đầy đủ đến lệnh của bạn.

    1 2 * * * /path/to/your/command
    
  2. Cung cấp một PATH phù hợp trong tệp crontab

    PATH=/usr:/usr/bin:/path/to/something/else
    1 2 * * * command 
    

Nếu lệnh của bạn yêu cầu các biến môi trường khác, bạn cũng có thể xác định chúng trong tệp crontab.

cron chạy lệnh của bạn với cwd == $ HOME

Bất kể chương trình bạn thực hiện nằm ở đâu trên hệ thống tập tin, thư mục làm việc hiện tại của chương trình khi cron chạy, nó sẽ là thư mục chính của người dùng . Nếu bạn truy cập các tệp trong chương trình của mình, bạn sẽ cần tính đến điều này nếu bạn sử dụng các đường dẫn tương đối hoặc (tốt nhất là) chỉ sử dụng các đường dẫn đủ điều kiện ở mọi nơi và tiết kiệm cho mọi người rất nhiều sự nhầm lẫn.

Lệnh cuối cùng trong crontab của tôi không chạy

Cron thường yêu cầu các lệnh được kết thúc bằng một dòng mới. Chỉnh sửa crontab của bạn; đi đến cuối dòng chứa lệnh cuối cùng và chèn một dòng mới (nhấn enter).

Kiểm tra định dạng crontab

Bạn không thể sử dụng crontab được định dạng crontab cho / etc / crontab hoặc các đoạn trong /etc/cron.d và ngược lại. Một crontab được định dạng người dùng không bao gồm tên người dùng ở vị trí thứ 6 của hàng, trong khi một crontab được định dạng hệ thống bao gồm tên người dùng và chạy lệnh như người dùng đó.

Tôi đặt một tệp trong /etc/cron. Đũahourly, hàng ngày, hàng tháng, hàng tháng} và nó không chạy

  • Kiểm tra xem tên tệp không có phần mở rộng xem phần chạy
  • Đảm bảo tệp có quyền thực thi.
  • Nói cho hệ thống biết nên sử dụng gì khi thực thi tập lệnh của bạn (ví dụ: đặt #!/bin/shở trên cùng)

Cron ngày liên quan đến lỗi

Nếu ngày của bạn gần đây bị thay đổi bởi người dùng hoặc cập nhật hệ thống, múi giờ hoặc khác, thì crontab sẽ bắt đầu hành xử thất thường và biểu hiện các lỗi kỳ quái, đôi khi không hoạt động, đôi khi không. Đây là nỗ lực của crontab để cố gắng "làm những gì bạn muốn" khi thời gian thay đổi từ bên dưới nó. Trường "phút" sẽ trở nên không hiệu quả sau khi giờ được thay đổi. Trong kịch bản này, chỉ các dấu sao sẽ được chấp nhận. Khởi động lại cron và thử lại mà không cần kết nối với internet (vì vậy ngày không có cơ hội đặt lại vào một trong các máy chủ thời gian).

Dấu hiệu phần trăm, một lần nữa

Để nhấn mạnh lời khuyên về các dấu hiệu phần trăm, đây là một ví dụ về những gì cron làm với chúng:

# cron entry
* * * * * cat >$HOME/cron.out%foo%bar%baz

sẽ tạo tệp ~ / cron.out chứa 3 dòng

foo
bar
baz

Điều này đặc biệt xâm phạm khi sử dụng datelệnh. Hãy chắc chắn để thoát khỏi các dấu hiệu phần trăm

* * * * * /path/to/command --day "$(date "+\%Y\%m\%d")"

Cũng có thể muốn đề cập đến trong phần 'env bị hạn chế' rằng LD_LIBRARY_PATH cũng có thể cần phải có bất kỳ thư mục bổ sung nào được đặt trong trường hợp tác vụ cron của bạn không thành công do không thể tìm thấy các thư viện chia sẻ.
DavidJ

lưu ý rằng bạn thậm chí có thể viết một cái gì đó như thế này: 35 1,5-23 / 2 * * * do_s Something thay vì 35,1,5,7,9, .. * * * Ngoài ra, crontab.guru này dịch các mục bạn thực hiện sang ngôn ngữ của con người.
Dennis Nolte

1
Việc chụp đầu ra không hoạt động đối với tôi, có thể là do vỏ sh. Tôi nghĩ cái này dễ mang theo hơn: ... /path/to/your/command >/tmp/mycommand.log 2>&1
chus

điều này làm việc cho tôi:sudo apt-get install postfix
jmunsch

công việc cron cũng phụ thuộc vào mức độ nặng của tập tin? Bởi vì tôi chạy thế giới xin chào đơn giản trong python với cron, nó đã hoạt động. Nhưng mã thứ hai của tôi hơi nặng và thường chạy nhưng với cron thì nó không cho bất kỳ đầu ra nào vào tệp.
Devendra Bhat

22

Debian Linux và công cụ phái sinh của nó (Ubuntu, Mint, v.v.) có một số đặc thù có thể ngăn công việc định kỳ của bạn thực thi; đặc biệt, các tập tin trong /etc/cron.d, /etc/cron.{hourly,daily,weekly,monthly}phải:

  • được sở hữu bởi root
  • chỉ có thể ghi bằng root
  • không thể ghi theo nhóm hoặc người dùng khác
  • có tên mà không có dấu chấm '.' hoặc bất kỳ ký tự đặc biệt nào khác nhưng '-' và '_'.

Người cuối cùng thường xuyên làm tổn thương người dùng không nghi ngờ; đặc biệt là bất kỳ kịch bản trong một trong các thư mục có tên whatever.sh, mycron.py, testfile.pl, vv sẽ không được thực thi, bao giờ hết.

Theo kinh nghiệm của tôi, điểm đặc biệt này là lý do thường xuyên nhất cho một cronjob không thực thi trên Debian và các dẫn xuất.

Xem man cronđể biết thêm chi tiết, nếu cần thiết.


19

Nếu cronjobs của bạn ngừng hoạt động, hãy kiểm tra xem mật khẩu của bạn chưa hết hạn. Vì kể từ khi có, tất cả các công việc cron đều dừng lại.
Sẽ có các thông báo /var/log/messagestương tự như bên dưới hiển thị các vấn đề với xác thực người dùng:

(username) FAILED to authorize user with PAM (Authentication token is no longer valid; new one required)


2
Chỉ cần có điều này là tốt (tệp thông báo lỗi / var / log / syslog cho tôi). Trong trường hợp của tôi, hộp DigitalOcean, tại thời điểm tạo, họ đặt lại mật khẩu gốc (tùy chọn) thành một mật khẩu khác, và rõ ràng cho đến khi bạn vào đó và thay đổi nó, tất cả các công việc định kỳ không chạy. Bummer. Khắc phục là một cái gì đó nhưsudo -u root passwd
rogerdpack

12

Lịch trình không thường xuyên và không thường xuyên

Cron là tất cả những thứ được coi là một trình lập lịch rất cơ bản và cú pháp không dễ dàng cho phép quản trị viên xây dựng lịch trình không phổ biến hơn một chút.

Hãy xem xét các công việc sau đây thường được giải thích là "chạy commandcứ sau 5 phút" :

*/5 * * * * /path/to/your/command

đấu với:

*/7 * * * * /path/to/your/command

không phải lúc nào cũng chạy commandcứ sau 7 phút .

Hãy nhớ rằng /nhân vật có thể được sử dụng để giới thiệu một bước nhưng các bước đó không vượt quá phần cuối của chuỗi, ví dụ: */7khớp với mỗi phút thứ 7 kể từ phút, 0-59 tức là 0,7,14,21,28,35,42,49, 56 nhưng giữa một giờ và tiếp theo sẽ có chỉ 4 phút giữa các lô , sau khi 00:56một loạt mới bắt đầu lúc 01:00, 01:07vv (và lô sẽ không chạy trên 01:03, 01:10, 01:17vv).


Thay vào đó, phải làm gì?

Tạo nhiều đợt

Thay vì một công việc định kỳ duy nhất, hãy tạo nhiều lô kết hợp với nhau trong lịch trình mong muốn.

Chẳng hạn, để chạy một đợt cứ sau 40 phút (00:00, 00:40, 01:20, 02:00, v.v.) tạo hai đợt, một đợt chạy hai lần vào các giờ chẵn và lần thứ hai chỉ chạy các giờ lẻ:

# The following lines create a batch that runs every 40 minutes i.e.

# runs on   0:00, 0:40,        02:00, 02:40         04:00 etc to 22:40
0,40 */2 * * * /path/to/your/command

# runs on               01:20,               03:20,       etc to 23:20
20 1/2 * * * /path/to/your/command

# Combined: 0:00, 0:40, 01:20, 02:00, 02:40, 03:20, 04:00 etc.

Chạy các đợt của bạn ít thường xuyên hơn

Thay vì chạy lô của bạn cứ sau 7 phút, đây là một lịch trình khó phân chia thành nhiều đợt, thay vào đó chỉ cần chạy nó sau mỗi 10 phút.

Bắt đầu các đợt của bạn thường xuyên hơn (nhưng ngăn nhiều đợt chạy đồng thời)

Nhiều lịch trình kỳ lạ phát triển vì thời gian chạy hàng loạt tăng / dao động và sau đó các lô được lên lịch với một chút biên an toàn bổ sung để ngăn các lần chạy tiếp theo của cùng một đợt chồng chéo và chạy đồng thời.

Thay vào đó, hãy suy nghĩ khác đi và tạo ra một cronjob sẽ thất bại một cách duyên dáng khi lần chạy trước chưa kết thúc, nhưng nó sẽ chạy khác. Xem phần hỏi đáp này :

* * * * * /usr/bin/flock -n /tmp/fcj.lockfile /usr/local/bin/frequent_cron_job 

Điều đó gần như sẽ ngay lập tức bắt đầu một lần chạy mới sau khi lần chạy trước đó / usr / local / bin / thường_cron_job hoàn thành.

Bắt đầu các đợt của bạn thường xuyên hơn (nhưng thoát ra một cách duyên dáng khi điều kiện không phù hợp)

Vì cú pháp cron bị giới hạn, bạn có thể quyết định đặt các điều kiện và logic phức tạp hơn trong chính công việc bó (hoặc trong tập lệnh bao quanh công việc bó hiện có). Điều đó cho phép bạn sử dụng các khả năng nâng cao của các ngôn ngữ kịch bản yêu thích của mình, để nhận xét mã của bạn và sẽ ngăn các cấu trúc khó đọc trong chính mục nhập crontab.

Trong bash, seven-minute-jobsau đó sẽ trông giống như:

#!/bin/bash
# seven-minute-job
# This batch will only run when 420 seconds (7 min) have passed
# since the file /tmp/lastrun was either created or updated

if [ ! -f /tmp/lastrun ] ; then
    touch /tmp/lastrun
fi

if [ $(( $(date +%s) - $(date -r /tmp/lastrun +%s) )) -lt 420 ] ; then
     # The minimum interval of 7 minutes between successive batches hasn't passed yet.
    exit 0
fi

####  Start running your actual batch job below

/path/to/your/command

#### actual batch job is done, now update the time stamp
date > /tmp/lastrun
#EOF

Mà sau đó bạn có thể an toàn (cố gắng) để chạy mỗi phút:

* * * * * /path/to/your/seven-minute-job

Một vấn đề khác nhau, nhưng tương tự sẽ để sắp xếp một lô để chạy vào ngày thứ Hai đầu tiên của mỗi tháng (hoặc thứ Tư thứ hai) vv Đơn giản chỉ cần sắp xếp lô để chạy mỗi thứ Hai và thoát khi ngày không phải là giữa 1 st hoặc 7 ngày và ngày trong tuần không phải là thứ hai

#!/bin/bash
# first-monday-of-the-month-housekeeping-job

# exit if today is not a Monday (and prevent locale issues by using the day number) 
if [ $(date +%u) != 1 ] ; then
  exit 0
fi

# exit if today is not the first Monday
if [ $(date +%d) -gt 7 ] ; then
  exit 0
fi

####  Start running your actual batch job below

/path/to/your/command

#EOF

Mà sau đó bạn có thể an toàn (cố gắng) để chạy mỗi thứ Hai:

0 0 * * 1 /path/to/your/first-monday-of-the-month-housekeeping-job

Đừng dùng cron

Nếu nhu cầu của bạn phức tạp, bạn có thể cân nhắc sử dụng một sản phẩm tiên tiến hơn được thiết kế để chạy lịch trình phức tạp (được phân phối trên nhiều máy chủ) và hỗ trợ các trình kích hoạt, phụ thuộc công việc, xử lý lỗi, thử lại và giám sát thử lại, v.v. " Lập kế hoạch công việc và / hoặc" tự động hóa khối lượng công việc ".


8

Cụ thể về PHP

Nếu bạn có một số công việc định kỳ như:

php /bla/bla/something.php >> /var/logs/somelog-for-stdout.log

Và trong trường hợp có lỗi, chúng sẽ được gửi cho bạn, nhưng chúng không - kiểm tra cái này.

PHP theo mặc định không gửi lỗi đến STDOUT. @see https://bugs.php.net/orms.php?id=22839

Để khắc phục điều này, hãy thêm vào php.ini của cli hoặc trong dòng của bạn (hoặc trong trình bao bọc bash cho PHP) sau:

  • --define display_startup_errors = 1
  • --define display_errors = 'stderr'

Cài đặt thứ 1 sẽ cho phép bạn có các phần tử như 'Bộ nhớ' và thứ 2 - để chuyển hướng tất cả chúng sang STDERR. Chỉ sau khi bạn có thể ngủ ngon, tất cả sẽ được gửi đến thư gốc của bạn thay vì chỉ đăng nhập.


2
Báo cáo lỗi đó đã bị đóng lại vào năm 2007 với trạng thái của bản vá được thêm vào các nhánh PHP 5.2+. Bạn có chắc chắn điều này là cần thiết? Tôi mới thử trên PHP 5.4 và nó có vẻ hoạt động tốt. (Nó vẫn cần cho PHP 4).
Xeoncross

@Xeoncross xem ngày trả lời :)
gaRex

1
Vâng, đó là điều làm tôi bối rối kể từ khi bạn trả lời vào năm 2013 và vé đã trở lại vào năm '07.
Xeoncross

0

Thêm câu trả lời của tôi từ đây để hoàn thiện và thêm một tài nguyên hữu ích khác:

Người crondùng có khác $PATHvới bạn:

Một vấn đề thường gặp của người dùng với crontabcác mục là họ quên rằng nó cronchạy trong một mục khác environmentvới người dùng đã đăng nhập. Ví dụ: người dùng tạo một chương trình hoặc tập lệnh trong $HOMEthư mục của mình và nhập lệnh sau để chạy nó:

$ ./certbot ... 

Lệnh chạy hoàn hảo từ dòng lệnh của mình. Sau đó, người dùng thêm lệnh đó vào lệnh của mình crontab, nhưng thấy lệnh này không hoạt động:

*/10 * * * * ./certbot ....

Lý do cho sự thất bại trong trường hợp này ./là một vị trí khác nhau cho cronngười dùng so với người dùng đã đăng nhập. Đó là, environmentlà khác nhau! PATH là một phần của environmentvà nó thường khác nhau đối với cronngười dùng. Vấn đề phức tạp này là environmentfor cronkhông giống nhau cho tất cả các bản phân phối * nix và có nhiều phiên bản củacron

Một giải pháp đơn giản cho vấn đề cụ thể này là cung cấp cho cronngười dùng một đặc tả đường dẫn hoàn chỉnh trong crontabmục:

0 22 * * * /path/to/certbot .....

Người crondùng là environmentgì?

Trong một số trường hợp, chúng tôi có thể cần biết environmentthông số kỹ thuật đầy đủ cho cronhệ thống của chúng tôi (hoặc chúng tôi có thể chỉ tò mò). Cái gì environmentcho cronngười dùng, và nó khác với chúng ta như thế nào? Hơn nữa, chúng ta có thể cần biết người dùng environmentkhác cron- rootví dụ ... rootngười dùng đang environmentsử dụng croncái gì? Một cách để học điều này là yêu cầu cronnói với chúng tôi:

  1. Tạo một tập lệnh shell trong thư mục chính của bạn ( ~/) như sau (hoặc với trình soạn thảo bạn chọn):
$ nano ~/envtst.sh
  1. Nhập thông tin sau vào trình chỉnh sửa, sau khi điều chỉnh cho hệ thống / người dùng của bạn:
#!/bin/sh 
/bin/echo "env report follows for user "$USER >> /home/you/envtst.sh.out 
/usr/bin/env >> /home/you/envtst.sh.out 
/bin/echo "env report for user "$USER" concluded" >> /home/you/envtst.sh.out
/bin/echo " " >> /home/you/envtst.sh.out
  1. Lưu tệp, thoát trình chỉnh sửa và đặt quyền truy cập tệp dưới dạng thực thi.
$ chmod a+rx ~/envtst.sh
  1. Chạy tập lệnh bạn vừa tạo và xem lại kết quả đầu ra /home/you/envtst.sh.out. Đầu ra này sẽ hiển thị môi trường hiện tại của bạn khi $USERbạn đăng nhập như:
$ ./envtst.sh $$ cat /home/you/envtst.sh.out
  1. Mở của bạn crontabđể chỉnh sửa:
$ crontab -e -u root
  1. Nhập dòng sau ở dưới cùng của bạn crontab:
* * * * *  /home/you/envtst.sh >> /home/you/envtst.sh.err 2>&1

TRẢ LỜI: Tệp đầu ra /home/you/envtst.sh.outsẽ chứa một danh sách environmentcho "người dùng gốc cron". Một khi bạn biết điều đó, điều chỉnh crontabmục nhập của bạn cho phù hợp.

Tôi không thể chỉ định lịch trình tôi cần trong crontabmục nhập của mình :

Tất nhiên, mục nhập lịch crontabtrình được xác định trong man crontabvà bạn nên đọc nó. Tuy nhiên, đọc man crontabvà hiểu lịch trình là hai điều khác nhau. Và thử và sai trên một đặc tả lịch trình có thể trở nên rất tẻ nhạt. May mắn thay, có một nguồn tài nguyên có thể giúp đỡ: Guru crontab. . Nhập đặc tả lịch trình của bạn và nó sẽ giải thích lịch trình bằng ngôn ngữ tiếng Anh đơn giản.

Cuối cùng, và có nguy cơ bị thừa với một trong những câu trả lời khác ở đây, đừng bị mắc kẹt khi nghĩ rằng bạn bị giới hạn trong một crontabmục duy nhất vì bạn có một công việc để lên lịch. Bạn có thể tự do sử dụng nhiều crontabmục bạn cần để có được lịch trình bạn cầ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.