我做了以下操作,使用“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。
答案 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
。