2013-05-21 3 views
5

ich das einfachste Beispiel gegeben versucht http://docs.opscode.com/resource_cron.html#examplesKoch kann nicht cron erstellen

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

Ich benutze Messer ssh, um das Rezept auf einem Koch-Client ausführen, und der Kunde gibt Fehler:

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

hat jemand das gleiche Problem schon einmal getroffen? Irgendwelche Lösungen?

Antwort

11

Ich stolperte in dasselbe Problem und fand, dass das Beispiel, das ich verwendete, Zeilenumbrüche darin hatte. Das Problem war, dass der Cron-Provider crontab -u user - und Pipes STDIN zum Prozess ausgeführt wird. Es scheint, dass es Newline aus irgendeinem Grund nicht gut akzeptiert.

In /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.4.0/lib/chef/provider/cron.rb, fand ich diese:

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 

Merkwürdigerweise scheint Ihr Beispiel läuft für mich zu arbeiten, und erstellt einen leeren crontab-Eintrag für root:

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

Dies ist für mich schon sagt dass Sie eine andere Version des Küchenchefs & Cron-Anbieter verwenden.

Also, je nach Version des Kochs Juwel Sie verwenden, könnte es this bug

Als Referenz sein, das Beispiel, das nicht für mich wurde auf der Grundlage eines dieser:

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 

Der Befehl, ich hatte war:

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

Es waren zwei Updates, die für mich gearbeitet:

  1. Verwenden command 'cd /path/to/src/my-project && bundle exec my_script.rb'
  2. Wechsel von cron Provider cron_d Anbieter aus dem cron cookbook

Hinweis: Ich glaube nicht in der Dokumentation zu Provider in Koch jedoch korrekt ist ... newlines are not supported in the crontab format es sei denn, sie sind mit einem Backslash \ ausgeblendet. In meinem Test mit dem zweiten Fix oben war die resultierende Crontab ungültig und hatte Zeilenumbrüche zwischen Befehlen, die nicht maskiert wurden.

+0

Dieses Rezept versucht, den Cron für einen Benutzer namens 'opscode' zu ändern, der meiner Meinung nach in Ihrer Umgebung fehlt. – akiva

+0

@akiva: Ich habe das Beispiel aus [Chef documentation] kopiert (https://docs.chef.io /resource_cron.html), 'user" opscode "' ist das, was sie als Beispiel gesetzt haben. Sie haben seitdem dieses Beispiel in 'user" getchef geändert "... Als ich es getestet habe, habe ich es offensichtlich geändert, um es einem Benutzer anzupassen, der für meinen Anwendungsfall existierte. – TrinitronX

0

Ich lief in die gleichen Fehler von Koch:

„Fehlerzustand name_of_cron_entry, Ausfahrt Aktualisierung: 1“

Aber in meinem Fall war das Problem ein schlechter Tag-of-Monats-Wert von einem bedingten Ausdruck.Wenn Newline-in-Befehl nicht Ihr Problem ist, stellen Sie sicher, dass Sie den Rest Ihres Cron Parameter passen die Anforderungen:

  • Minute: 0-59

  • Stunden: 0-23

  • Tage-of-Monat: 31.1

  • Monat: 1-12 oder JAN-DEC

  • Tages of-Woche: 0-6 oder SUN-SAT

  • Jahr: 1970-2099

0

die documentation besagt, dass, wenn ein Benutzer nicht explizit angegeben wird Koch versucht, die Wurzel des cron zu ändern. Das scheitert natürlich.

möglich fix: 1. einen Benutzer in Ihrem Rezepte angeben 2. Lauf Koch-Anwendung als root (entmutigt)

+0

'chef-apply' ist hier nicht erlaubt, es sollte für Tests/One-Shot-Änderungen auf einer Workstation verwendet werden, nicht für das Management. Und Chef-Client soll als root ausgeführt werden, also ist es absolut nicht entmutigt. (Und FWIW, der Standardwert ist root, weil Chef als root ausgeführt werden soll). (Später Kommentar tut mir leid, aber es lohnt sich, es zu sagen) – Tensibai

0

Ein weiterer Grund für diesen Fehler könnte sein, dass der Befehl Sie versuchen, die hinzufügen Crontab könnte zu lang sein. Die maximale Länge für einen Cron-Befehl beträgt 999 Zeichen, siehe here.