QA@IT
«回答へ戻る

回答を投稿

crontabがどうなっているかわかりませんが(レンタルサーバーだからそもそも見れないですかね?)、
cronでエラーが起きた場合、標準では実行ユーザーのメールボックスにメールが飛んでいるはずです。

レンタルサーバーだとレンタルサーバー次第ですが(わたしが使っているとこだと、あらかじめcronのログを受け取るメールアドレスを指定しておけて、出力があった場合にメールが飛んできます)、
「レンタルサーバー名 cron エラー 出力」とかで検索すれば説明しているサイトが見つかるかもしれませんね。

質問 1 ですが、

自分の環境のcronならメールファイル見たり、 crontabでファイルに出力してしまう (> /tmp/my_cron_dev_debug.log 2>&1 みたいな)コマンドにしてみたりでしょうか。

しかしレンタルサーバーのcronとなるといろいろとレンタルサーバー次第になるので、
とりあえず、以下の様にbegin-rescue でエラーメッセージを拾ってみるとエラーメッセージが見れるかもしれません。

#スクレイピング
charset = nil
begin
  html = open(url) do |f| 
    charset = f.charset               
    f.read   
  end
rescue => e
  File.open("check_scraping.txt","w") do |file|
    file.puts(e.message)
    file.puts(e.backtrace)
  end  
end

または

begin
  #スクレイピング
  charset = nil
  html = open(url) do |f| 
    charset = f.charset               
    f.read   
  end
rescue => e
  scraping_error = e.message
  scraping_backtrace = e.backtrace
ensure
  # エラーでもそうでなくても通る
  File.open('check_scraping.txt', 'w') do |file|
    file.puts(scraping_error) if defined?(scraping_error)
    file.puts(scraping_backtrace) if defined?(scraping_backtrace)

    file.puts(charset) if defined?(charset)
    file.puts(html) if defined?(html)
    file.puts(url) if defined?(url)
  end
end

上記のスクリプトで、エラーでファイルが出るかどうかは

begin
  puts 1 + 'a'
rescue => e
  ...

などで一旦確認してみるといいでしょう
プロセスがkillされてたりすると、これだと出ないかもしれませんね。

質問 2 ですが、

それ以外だと、環境変数(cronで実行中のもの$PATHだけでなく)、起動シェル(素のshだったり)、プロファイル(.bash_profile等)、rubyバージョン。
私ならこのあたりを気にします。
環境変数全部見れれば他のはそれで大体わかると思います。

あとは直接スクリプト(.rbファイル)を指定するのか、rubyスクリプトを実行するシェルスクリプトを書くのかも検討するかも知れません。

質問 3 は手動では実行できているとのことなのでエラーの内容次第ですね。

crontabがどうなっているかわかりませんが(レンタルサーバーだからそもそも見れないですかね?)、
cronでエラーが起きた場合、標準では実行ユーザーのメールボックスにメールが飛んでいるはずです。

レンタルサーバーだとレンタルサーバー次第ですが(わたしが使っているとこだと、あらかじめcronのログを受け取るメールアドレスを指定しておけて、出力があった場合にメールが飛んできます)、
「レンタルサーバー名 cron エラー 出力」とかで検索すれば説明しているサイトが見つかるかもしれませんね。

質問 1 ですが、

自分の環境のcronならメールファイル見たり、 crontabでファイルに出力してしまう (`> /tmp/my_cron_dev_debug.log 2>&1` みたいな)コマンドにしてみたりでしょうか。

しかしレンタルサーバーのcronとなるといろいろとレンタルサーバー次第になるので、
とりあえず、以下の様にbegin-rescue でエラーメッセージを拾ってみるとエラーメッセージが見れるかもしれません。

```ruby
#スクレイピング
charset = nil
begin
  html = open(url) do |f| 
    charset = f.charset               
    f.read   
  end
rescue => e
  File.open("check_scraping.txt","w") do |file|
    file.puts(e.message)
    file.puts(e.backtrace)
  end  
end
```

または

```ruby
begin
  #スクレイピング
  charset = nil
  html = open(url) do |f| 
    charset = f.charset               
    f.read   
  end
rescue => e
  scraping_error = e.message
  scraping_backtrace = e.backtrace
ensure
  # エラーでもそうでなくても通る
  File.open('check_scraping.txt', 'w') do |file|
    file.puts(scraping_error) if defined?(scraping_error)
    file.puts(scraping_backtrace) if defined?(scraping_backtrace)
    
    file.puts(charset) if defined?(charset)
    file.puts(html) if defined?(html)
    file.puts(url) if defined?(url)
  end
end
```

上記のスクリプトで、エラーでファイルが出るかどうかは

```ruby
begin
  puts 1 + 'a'
rescue => e
  ...
```

などで一旦確認してみるといいでしょう
プロセスがkillされてたりすると、これだと出ないかもしれませんね。


質問 2 ですが、

それ以外だと、環境変数(cronで実行中のもの$PATHだけでなく)、起動シェル(素のshだったり)、プロファイル(.bash_profile等)、rubyバージョン。
私ならこのあたりを気にします。
環境変数全部見れれば他のはそれで大体わかると思います。

あとは直接スクリプト(.rbファイル)を指定するのか、rubyスクリプトを実行するシェルスクリプトを書くのかも検討するかも知れません。

質問 3 は手動では実行できているとのことなのでエラーの内容次第ですね。