2010-12-07 6 views
0

J'ai un programme ruby, assez simple, fait la recherche DNS sur un tas d'hôtes. Le programme fonctionne bien depuis le terminal (Mac OS X 10.6.5), Ruby 1.9.2 en utilisant RVM.Ruby prog ne fonctionnera pas en tant que LaunchDaemon

Je voudrais exécuter sur un calendrier et que vous souhaitez charger un LaunchDaemon de le faire. Le programme ne fonctionne pas en tant que LauanchDaemon, et les fichiers de sortie sont créés, mais vides, donc je suis incapable de voir les erreurs. Je soupçonne que cela a quelque chose à voir avec les inclusions.

Voici le plist (il charge bien et tente d'exécuter comme en témoigne la création de deux fichiers de sortie):

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
    <dict> 
    <key>Label</key> 
    <string>com.jsw.ping</string> 
    <key>RunAtLoad</key> 
    <true/> 
    <key>Debug</key> 
    <true/> 
    <key>StandardOutPath</key> 
    <string>/var/jsw/logs/ping.txt</string> 
    <key>EnvironmentVariables</key> 
     <dict> 
      <key>PATH</key> 
       <string>/Users/scott/.rvm/gems/ruby-1.9.2-p0/bin:/Users/scott/.rvm/gems/[email protected]/bin:/Users/scott/.rvm/rubies/ruby-1.9.2-p0/bin:/Users/scott/.rvm/gems/[email protected]/bin:/Users/scott/.rvm/gems/[email protected]/bin:/Users/scott/.rvm/rubies/ruby-1.9.2-p0/bin:/Users/scott/.rvm/bin:/usr/local/maven/bin:/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/usr/X11/bin</string> 
     </dict> 
    <key>StandardErrorPath</key> 
    <string>/var/jsw/logs/ping.err.txt</string> 
    <key>ProgramArguments</key> 
    <array> 
     <string>ping.rb</string> 
    </array> 
    <key>StartInterval</key> 
     <integer>1800</integer> 
    <key>WorkingDirectory</key> 
     <string>/Library/WebServer/vHosts/scripts/ping/</string> 
    <key>UserName</key> 
     <string>scott</string> 
    </dict> 
</plist> 

Le programme Ruby est:

#!/Users/scott/.rvm/rubies/ruby-1.9.2-p0/bin/ruby 
require 'rubygems' 
require 'active_record' 
require 'yaml' 
require 'dnsruby' 
include Dnsruby 


dbconfig = YAML::load(File.open('database.yml')) 
ActiveRecord::Base.establish_connection(dbconfig) 

# flush cache 
rslt = `dscacheutil -flushcache` 

Dnsruby::DNS.open 
rslvr = Dnsruby::DNS.new 

now = DateTime.now.to_s 
mysqlDT = now.gsub("T", " ") 
puts mysqlDT 


class Host < ActiveRecord::Base 
end 
class Ip < ActiveRecord::Base 
end 

Host.find_each do |svr| 
    ip = rslvr.getaddress(svr.host).to_s 
    svr.lastIP = ip 
    svr.save 
    Ip.create(:ip => ip, :host => svr.host, :DT => mysqlDT, :hostID => svr.id) 
end 
+0

Avez-vous ajouté une sorte de journalisation? Il peut être utile de voir ce qui se passe dans le script pendant qu'il est exécuté par LaunchDaemon. – jergason

+0

Je ne suis pas sûr de savoir comment ajouter la journalisation. C'est ce que les chemins Std Out Path et Std Err sont censés faire, mais pour une raison quelconque, les fichiers sont vides – Scott

Répondre

0

Le problème racine a été que le travail LaunchDaemon était exécuté à partir d'un shell qui n'a pas correctement configuré RVM et que les classes incluses n'ont donc pas pu être localisées. Comme je n'ai aucun programme Ruby sur mon système, j'ai supprimé RVM et installé Ruby 1.9.2 dans/usr/local/bin sur mon système, puis j'ai réinstallé les gems.

Le deuxième problème (aucun enregistrement) était due à une erreur d'autorisations.

Questions connexes