【问题标题】:error with crontab running ruby scriptcrontab 运行 ruby​​ 脚本时出错
【发布时间】:2016-12-18 17:54:21
【问题描述】:

希望你能帮我解决我的问题。

我用 ruby​​ 实现了一个脚本,手动运行完美。

但是在 crontab 中运行 */1 * * * * cd /Users/diogo/workspace/outros/crawler_trf/ && /Users/diogo/.rvm/wrappers/ruby-2.3.0@crawler/ruby get_news.rb >> /tmp/crawler_trf.out 这样的行我得到了这个错误:

/Users/diogo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:882:in `rescue in block in connect': Failed to open TCP connection to www.folhadirigida.com.br:80 (getaddrinfo: nodename nor servname provided, or not known) (SocketError)
from /Users/diogo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:879:in `block in connect'
from /Users/diogo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/timeout.rb:91:in `block in timeout'
from /Users/diogo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/timeout.rb:101:in `timeout'
from /Users/diogo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:878:in `connect'
from /Users/diogo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:863:in `do_start'
from /Users/diogo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/net/http.rb:852:in `start'
from /Users/diogo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/open-uri.rb:319:in `open_http'
from /Users/diogo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/open-uri.rb:737:in `buffer_open'
from /Users/diogo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/open-uri.rb:212:in `block in open_loop'
from /Users/diogo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/open-uri.rb:210:in `catch'
from /Users/diogo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/open-uri.rb:210:in `open_loop'
from /Users/diogo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/open-uri.rb:151:in `open_uri'
from /Users/diogo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/open-uri.rb:717:in `open'
from /Users/diogo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/open-uri.rb:35:in `open'
from get_news.rb:6:in `read_data'
from get_news.rb:44:in `<main>'

脚本文件有如下代码...

require 'nokogiri'
require 'open-uri'
require 'mail'

def read_data
  page        = Nokogiri::HTML(open('http://www.folhadirigida.com.br/fd/Satellite/concursos/noticias-TRFRJES-area-de-apoio-2016-2000153335216/'))
  title       = page.css('#tblResult').css('tr')[1].css('a').first.text rescue nil
  message     = page.css('#tblResult').css('tr')[1].text rescue nil

  file_name   = 'trf'
  last_title  = File.open("/tmp/#{file_name}", 'r') { |file| file.read } rescue nil

  if title && last_title != title
    send_email(title, message)

    File.open("/tmp/#{file_name}", 'w') { |file| file.write(title) }
  else
    send_email("Nada novo", "")
  end
end

def send_email(title, message)
  Mail.defaults do
    delivery_method :smtp, {
      :address => 'smtp.gmail.com',
      :port => 587,
      :domain => 'gmail.com',
      :user_name => 'myemail',
      :password => 'mypass',
      :authentication => :plain,
      :enable_starttls_auto => true
    }
  end

  Mail.deliver do
    to 'myemail'
    from 'Concursos - Novidades TRF <myemail>'
    subject 'Novidade sobre o TRF'
    content_type 'text/html; charset=UTF-8'
    body "<h1>#{title}</h1>#{message}"
  end
end

read_data

如果我执行curl + url 完美运行...我不知道发生了什么。我需要一些解释和解决方案。

【问题讨论】:

    标签: ruby macos crontab


    【解决方案1】:

    嗯,当脚本作为 cron 运行时,听起来像是 DNS 问题。

    我会尝试在您的脚本顶部使用require "resolv-replace.rb",就像它所描述的here一样。

    稍后在家里我试一试,我会在我的 mac 上测试它。

    【讨论】: