【问题标题】:Ruby prog won't run as LaunchDaemonRuby prog 不会作为 LaunchDaemon 运行
【发布时间】:2010-12-08 20:10:13
【问题描述】:

我有一个 ruby​​ 程序,非常简单,只是在一堆主机上进行 DNS 查找。该程序在终端 (Mac OS X 10.6.5) 上运行良好,Ruby 1.9.2 使用 RVM。

我想按计划运行它,并想加载一个 LaunchDaemon 来执行此操作。该程序不作为 LauanchDaemon 运行,并且输出文件已创建,但为空,因此我无法看到错误。我怀疑这与包含有关。

这是 plist(它可以正常加载并尝试运行,这可以通过创建两个输出文件来证明):

<?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/ruby-1.9.2-p0@global/bin:/Users/scott/.rvm/rubies/ruby-1.9.2-p0/bin:/Users/scott/.rvm/gems/ruby-1.9.2-p0@rails3/bin:/Users/scott/.rvm/gems/ruby-1.9.2-p0@global/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>

Ruby 程序是:

#!/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

【问题讨论】:

  • 您添加了某种日志记录吗?在 LaunchDaemon 运行时查看脚本内部发生的情况可能会有所帮助。
  • 我不确定如何添加日志记录。这就是 Std Out Path 和 Std Err 路径应该做的,但由于某种原因,文件是空的

标签: ruby macos plist


【解决方案1】:

根本问题是 LaunchDaemon 作业是从没有正确设置 RVM 的 shell 运行的,因此无法找到包含的类。由于我的系统上没有任何遗留的 Ruby 程序,我删除了 RVM 并在我的系统上的 /usr/local/bin 中安装了 Ruby 1.9.2,然后重新安装了 gems。

第二个问题(没有日志记录)是由于权限错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多