我偶然发现了同样的问题,发现我使用的示例中有换行符。问题是 cron 提供程序运行并将STDINcrontab -u user -
管道传输到进程。无论出于何种原因,它似乎都不能很好地接受换行符。
在/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.4.0/lib/chef/provider/cron.rb
中,我发现了这个:
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
奇怪的是,运行您的示例似乎对我有用,并为 root 创建了一个空的 crontab 条目:
root@chef-test-01:~# crontab -l
# Chef Name: name_of_cron_entry
MAILTO=admin@opscode.com
* 8 * * 6
这向我表明您正在使用不同版本的 chef gem & cron 提供程序。
因此,根据您使用的 chef gem 版本,可能是这个错误
作为参考,对我不起作用的示例基于以下示例:
cron "cookbooks_report" do
action node.tags.include?('cookbooks-report') ? :create : :delete
minute "0"
hour "0"
weekday "1"
user "opscode"
mailto "nharvey@opscode.com"
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
我正在运行的命令是:
command %Q{
cd /path/to/src/my-project &&
bundle exec my_script.rb
}
有 2 个修复对我有用:
- 利用
command 'cd /path/to/src/my-project && bundle exec my_script.rb'
- 从cron 食谱
cron
从提供者更改为提供者cron_d
注意:我不认为 chef 中任何一个提供者的文档都是正确的...... crontab 格式不支持换行符,除非它们用反斜杠转义\
。在我对上面第二个修复的测试中,生成的 crontab 无效,并且在未转义的命令之间有换行符。