【问题标题】:Not able to test cron job using whenever gem in rails 3无法在 Rails 3 中使用 gem 测试 cron 作业
【发布时间】:2014-07-15 20:16:06
【问题描述】:

我使用“runner”而不是 rake 任务在 rails 3 中执行了以下任务。

第 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 作业方法的详细信息:


    # 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。

【问题讨论】:

  • 正在寻找有关此问题的回复。我相信很多人会在 RoR 中实现 cron。请帮忙。
  • 您是否检查了运行 crontab 的用户的本地邮件投递?
  • 如果您指的是 maildrop 实用程序,我还没有测试该用户使用 maildrop 的本地邮件传递。我在发送邮件的 Rails 中使用 ActiveMailer 支持。也适用于开发。
  • 我不是指实用程序,而是默认情况下,cron 会将合并的标准输出和标准输入的 cronjobs 的电子邮件发送到该用户的本地邮件投递文件,通常是 /var/spool/&lt;username&gt;/var/mail/&lt;username&gt;

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


【解决方案1】:

我按照 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

【讨论】:

  • Ankur,这不是答案;这是有关该问题的进一步信息。在 Stack Overflow 上,如果您有关于该问题的更多信息,您需要编辑您的原始问题,然后使用附加信息创建一个 Update 部分。您可以有多个更新;只需将它们列为 Update 1Update 2 等,或添加日期以区分它们。
【解决方案2】:

您的 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") 
}

【讨论】:

  • 这不起作用。我仍然没有看到任何错误日志文件被创建。
【解决方案3】:

-我发现 /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)

-日志跟踪:

第一次调用:

    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(),它们也没有在任何地方记录,这意味着作业的执行甚至没有开始。

任何进一步的调试线索?

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2016-03-01
      • 2012-11-07
      • 2013-03-31
      • 2015-02-05
      • 2012-04-28
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多