无法在rails 3中使用gem时测试cron作业

时间:2014-05-27 03:24:15

标签: ruby-on-rails ruby-on-rails-3 cron crontab whenever

我做了以下操作,使用“runner”而不是rake任务在rails 3中实现cron作业。

第1步: 我有gem安装和scheduler.rb有以下内容:

  set :environment, 'development'
  set :output, {
 :error    => "/log/error.log",
 :standard => "/log/cron.log" 
  }

  every 1.minute do
  runner "Cron.sendAutomaticsSMS()"
  end

第2步:

Cron文件:lib / cron.rb

    class Cron < ActiveRecord::Base

      def **sendAutomaticsSMS**()
         ----some code here ---
      end
    end

第3步:

    whenever --update-crontab --set environment=development 

这会更新crontab文件。

第4步:

使用以下方法检查crontab文件的内容:

    crontab -e  

打开cron选项卡文件,其中包含要调用的cron job方法的详细信息:


    # Begin Whenever generated tasks for: store

    # End Whenever generated tasks for: store

    # Begin Whenever generated tasks for: /code/rails_projects/new/bhk/bigbhk-     dev/config/schedule.rb
    * * * * * /bin/bash -l -c 'cd <*RAILS_APP_PROJECT_LOCATION*> && script/rails runner -e development '\''**Cron.sendAutomaticsSMS()**'\'' >$

    # End Whenever generated tasks for: /code/rails_projects/new/bhk/bigbhk-dev/config/schedule.rb

第5步:

运行cron作业:

    $sudo service cron restart

    cron stop/waiting
    cron start/running, process 4027

这没有任何作用。我等待sendAutomaticsSMS()方法中定义的操作执行,但cron甚至没有输入此方法。

我在log / development.log中没有看到任何错误,我的rails应用程序中没有log / cron.log。

4 个答案:

答案 0 :(得分:0)

我按照tamouse的建议检查了邮件丢弃文件的内容。我看到这些文件中引用的cron日志位置,但这些文件在相应位置生成或不存在。

   /var/spool/cron/crontabs/<username>

Begin Whenever generated tasks for: <RAILS_ROOT>/config/schedule.rb /bin/bash -l -c 'cd <RAILS_ROOT> && script/rails runner -e development '\''Cron.sendAutomaticsSMS()'\'' >> /log/cron.log 2>> /log/error.log'

   /var/mail/<username>

From ankur@ankur-Lenovo-G470  Fri May 30 21:29:01 2014
Return-Path: <ankur@ankur-Lenovo-G470>
X-Original-To: ankur
Delivered-To: ankur@ankur-Lenovo-G470
Received: by ankur-Lenovo-G470 (Postfix, from userid 1000)
        id D885D16172C; Fri, 30 May 2014 21:29:01 +0530 (IST)
From: root@ankur-Lenovo-G470 (Cron Daemon)
To: ankur@ankur-Lenovo-G470
Subject: Cron <ankur@ankur-Lenovo-G470> /bin/bash -l -c 'cd <RAILS_ROOT> && script/rails runner -e development '\''Cron.sendAutomaticsSMS()'\'' >> /log/cron.log 2>> /log/error.log'
Content-Type: text/plain; charset=ANSI_X3.4-1968

X-Cron-Env: < SHELL=/bin/sh > 

X-Cron-Env: < HOME=/home/username >

X-Cron-Env: < PATH=/usr/bin:/bin >

X-Cron-Env: < LOGNAME=username >

Message-Id: <20140530155901.D885D16172C@ankur-Lenovo-G470>
Date: Fri, 30 May 2014 21:29:01 +0530 (IST)


/bin/bash: /log/cron.log: No such file or directory

答案 1 :(得分:0)

您的cron任务正在尝试写入/log/,即文件系统根级别的目录。现在在schedule.rb文件中看到它:

set :output, {
  :error    => "/log/error.log",
  :standard => "/log/cron.log" 
}

我认为你需要的是:

log_dir = File.expand_path("../log/", __FILE__)
set :output, {
  :error    => File.join(log_dir, "error.log"),
  :standard => File.join(log_dir, "cron.log") 
}

答案 2 :(得分:0)

- 我发现 / var / log / syslog 文件每隔1分钟使用cron调用进行更新,这是我的cron作业周期。我列出了两个这样的连续调用的日志跟踪。

- 但是在定义的日志位置中没有生成错误文件,并且cron作业没有执行

   /code/rails_projects/new/bhk/bigbhk-dev/config/log/cron.log (path for this location is defined in config/scheduler.rb file)

-Log Trace:

第一次调用:

    Jun  8 20:02:01 ankur-Lenovo-G470 CRON[27365]: (ankur) CMD (/bin/bash -l -c 'cd /code/rails_projects/new/bhk/bigbhk-dev && script/rails runner -e development '\''Cron.sendAutomaticsSMS()'\'' >> /code/rails_projects/new/bhk/bigbhk-dev/config/log/cron.log 2>> /code/rails_projects/new/bhk/bigbhk-dev/config/log/error.log')
    Jun  8 20:02:02 ankur-Lenovo-G470 postfix/pickup[22599]: 02CEA161719: uid=1000 from=<ankur>
    Jun  8 20:02:02 ankur-Lenovo-G470 postfix/cleanup[22701]: 02CEA161719: message-id=<20140608143202.02CEA161719@ankur-Lenovo-G470>
    Jun  8 20:02:02 ankur-Lenovo-G470 postfix/qmgr[12204]: 02CEA161719: from=<ankur@ankur-Lenovo-G470>, size=878, nrcpt=1 (queue active)
    Jun  8 20:02:02 ankur-Lenovo-G470 postfix/local[22703]: 02CEA161719: to=<ankur@ankur-Lenovo-G470>, orig_to=<ankur>, relay=local, delay=0.14, delays=0.09/0/0/0.04, dsn=2.0.0, status=sent (delivered to mailbox)
    Jun  8 20:02:02 ankur-Lenovo-G470 postfix/qmgr[12204]: 02CEA161719: removed

第二次调用:

  Jun  8 20:03:01 ankur-Lenovo-G470 CRON[27468]: (ankur) CMD (/bin/bash -l -c 'cd /code/rails_projects/new/bhk/bigbhk-dev && script/rails runner -e development '\''Cron.sendAutomaticsSMS()'\'' >> /code/rails_projects/new/bhk/bigbhk-dev/config/log/cron.log 2>> /code/rails_projects/new/bhk/bigbhk-dev/config/log/error.log')
  Jun  8 20:03:01 ankur-Lenovo-G470 postfix/pickup[22599]: 431E5161719: uid=1000 from=<ankur>
  Jun  8 20:03:01 ankur-Lenovo-G470 postfix/cleanup[22701]: 431E5161719: message-id=<20140608143301.431E5161719@ankur-Lenovo-G470>
  Jun  8 20:03:01 ankur-Lenovo-G470 postfix/qmgr[12204]: 431E5161719: from=<ankur@ankur-Lenovo-G470>, size=878, nrcpt=1 (queue active)
  Jun  8 20:03:01 ankur-Lenovo-G470 postfix/local[22703]: 431E5161719: to=<ankur@ankur-Lenovo-G470>, orig_to=<ankur>, relay=local, delay=0.14, delays=0.09/0/0/0.04, dsn=2.0.0, status=sent (delivered to mailbox)
  Jun  8 20:03:01 ankur-Lenovo-G470 postfix/qmgr[12204]: 431E5161719: removed

- 在 var / log / auth / log 中,我看到以下内容:

  Jun  8 19:52:38 ankur-Lenovo-G470 sudo:    ankur : TTY=pts/3 ; PWD=/code/rails_projects/new/bhk/bigbhk-dev ; USER=root ; COMMAND=/usr/sbin/service cron restart
  Jun  8 19:52:38 ankur-Lenovo-G470 sudo: pam_unix(sudo:session): session opened for user root by ankur(uid=0)
  Jun  8 19:52:38 ankur-Lenovo-G470 sudo: pam_unix(sudo:session): session closed for user root
  Jun  8 20:03:01 ankur-Lenovo-G470 CRON[27467]: pam_unix(cron:session): session opened for user ankur by (uid=0)
  Jun  8 20:03:01 ankur-Lenovo-G470 CRON[27467]: pam_unix(cron:session): session closed for user ankur

- 我在我的cron作业方法中打印的日志消息: sendAutomaticsSMS (),它们也没有被记录到任何地方,这意味着作业的执行甚至没有开始。

任何进一步的调试线索?

答案 3 :(得分:0)

我认为这是你问题的症结所在:/bin/bash: /log/cron.log: No such file or directory。驱动器的根目录下没有log目录。尝试将日志路径更改为/var/log/error.log/var/log/cron.log