2013-05-21 21 views
5

Tôi đã thử các ví dụ đơn giản nhất do http://docs.opscode.com/resource_cron.html#examplesđầu bếp không thể tạo cron

cron "name_of_cron_entry" do 
     hour "8" 
     weekday "6" 
     mailto "[email protected]" 
     action :create 
    end 

tôi sử dụng dao ssh để làm cho công thức chạy trên một khách hàng đầu bếp, và khách hàng cho lỗi:

Error executing action create on resource cron[name_of_cron_entry] 
Error updating state of name_of_cron_entry, exit: 1 

có ai gặp vấn đề tương tự trước đây không? Bất kỳ giải pháp?

Trả lời

11

Tôi tình cờ gặp vấn đề tương tự này và thấy rằng ví dụ tôi đang sử dụng có dòng mới trong đó. Vấn đề là nhà cung cấp cron chạy crontab -u user - và đường ống STDIN cho quy trình. Có vẻ như nó không chấp nhận dòng mới vì bất kỳ lý do gì.

Trong /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.4.0/lib/chef/provider/cron.rb, tôi thấy điều này:

status = popen4("crontab -u #{@new_resource.user} -", :waitlast => true) do |pid, stdin, stdout, stderr| 
    stdin.write crontab 
    end 
    if status.exitstatus > 0 
     raise Chef::Exceptions::Cron, "Error updating state of #{@new_resource.name}, exit: #{status.exitstatus}" 
    end 

Lạ lùng thay, chạy ví dụ của bạn dường như làm việc cho tôi, và tạo ra một mục crontab trống cho root:

[email protected]:~# crontab -l 
# Chef Name: name_of_cron_entry 
[email protected] 
* 8 * * 6 

này gợi ý với tôi bạn đang sử dụng một phiên bản khác của nhà cung cấp đầu bếp gem & cron.

Vì vậy, tùy thuộc vào phiên bản của đá quý đầu bếp bạn đang sử dụng, nó có thể là this bug

Để tham khảo, ví dụ mà không làm việc đối với tôi là dựa trên một điều này:

cron "cookbooks_report" do 
    action node.tags.include?('cookbooks-report') ? :create : :delete 
    minute "0" 
    hour "0" 
    weekday "1" 
    user "opscode" 
    mailto "[email protected]" 
    home "/srv/opscode-community-site/shared/system" 
    command %Q{ 
    cd /srv/opscode-community-site/current && 
    env RUBYLIB="/srv/opscode-community-site/current/lib" 
    RAILS_ASSET_ID=`git rev-parse HEAD` RAILS_ENV="#{rails_env}" 
    bundle exec rake cookbooks_report 
    } 
end 

lệnh tôi đã chạy là:

command %Q{ 
    cd /path/to/src/my-project && 
    bundle exec my_script.rb 
    } 

có 2 bản sửa lỗi đã làm việc cho tôi:

  1. Sử dụng command 'cd /path/to/src/my-project && bundle exec my_script.rb'
  2. Thay đổi từ cron nhà cung cấp để cung cấp cron_d từ cron cookbook

Lưu ý: Tôi không nghĩ rằng các tài liệu hướng dẫn cho một trong hai nhà cung cấp trong bếp là đúng tuy nhiên ... newlines are not supported in the crontab format trừ khi họ được thoát bằng dấu gạch chéo ngược \. Trong thử nghiệm của tôi với sửa chữa thứ hai ở trên, kết quả là crontab không hợp lệ và có dòng mới giữa các lệnh không được thoát.

+0

công thức này cố sửa đổi cron cho người dùng gọi là 'opscode' mà tôi tin là thiếu ở môi trường của bạn – akiva

+0

@akiva: Tôi đã sao chép ví dụ từ [Chef documentation] (https://docs.chef.io /resource_cron.html), 'user" opscode "' là những gì họ đã đặt làm ví dụ. Họ đã thay đổi ví dụ này thành 'người dùng 'getchef" '... Khi tôi kiểm tra nó, tôi rõ ràng đã thay đổi nó cho phù hợp với một người dùng đã tồn tại trong trường hợp sử dụng của tôi. – TrinitronX

0

Tôi chỉ cần chạy vào báo lỗi tương tự từ đầu bếp:

"Lỗi cập nhật trạng thái của name_of_cron_entry, xuất cảnh: 1"

Nhưng trong trường hợp của tôi, vấn đề này là một ngày trong tháng giá trị xấu từ một biểu thức có điều kiện.Nếu newline-in-lệnh không phải là vấn đề của bạn, hãy chắc chắn phần còn lại của cron của bạn thông số phù hợp với các yêu cầu:

  • phút: 0-59

  • giờ: 0-23

  • ngày trong tháng: 1-31

  • tháng: 1-12 hoặc JAN-Dec

  • ngày trong tuần: 0-6 hoặc SUN-SAT

  • năm: 1970-2099

0

các documentation trạng thái mà khi người dùng không được xác định một cách rõ ràng đầu bếp cố gắng sửa đổi cron của root. điều này, rõ ràng là thất bại.

có thể sửa chữa: 1. chỉ định một người sử dụng trong công thức của bạn 2. chạy đầu bếp áp dụng như root (khuyến khích)

+0

'đầu bếp-áp dụng' nằm ngoài phạm vi ở đây, nó được cho là được sử dụng để kiểm tra/một thay đổi bắn trên một máy trạm, không phải cho quản lý. Và đầu bếp-khách hàng có nghĩa vụ phải được chạy như là người chủ, vì vậy nó là hoàn toàn không nản lòng. (Và FWIW, mặc định là root bởi vì đầu bếp được cho là chạy root). (Nhận xét trễ xin lỗi, nhưng mặc dù nó đáng nói) – Tensibai

0

Một lý do khác cho lỗi này có thể là các lệnh bạn đang cố gắng để thêm vào crontab có thể quá dài.

Độ dài tối đa cho lệnh cron là 999 ký tự, xem here.

Các vấn đề liên quan