6

在我的schedule.rb文件中,我有以下几行:

set :output, '/log/cron_log.log'

every 5.minutes do
  command 'echo "hello"'
end

whenever -w按照这个问题Rails 中的建议运行,使用开发中的任何时候 gem,并且我假设 cronfile 已编写并正在运行。(我也尝试重新启动 Rails 服务器。)

当我运行时,$ crontab -l我看到以下内容:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /bin/bash
-l -c 'echo "hello" >> /log/cron_log.log 2>&1'

但是我找不到日志文件。我检查了 rails_project/log、~/log 和 /log 无济于事。顺便说一句,在 OSX 上。

如何将日志文件写入 rails 项目日志文件夹?

4

1 回答 1

36

你的日志在哪里?

您将输出文件放在最高目录级别:

$ cd /log

要查看文件是否存在以及其中是否有数据:

$ ls -la cron_log.log

根据需要创建日志文件:

$ touch cron_log.log

为您自己的本地调试打开权限(不要在生产中这样做!)

$ chmod +rw cron_log.log  

你的命令在运行吗?

要手动运行命令以查看它是否按预期工作:

$ /bin/bash -l -c 'echo "hello" >> /log/cron_log.log 2>&1'

为了提高您的安全性并保护您的路径,请使用完整路径:

wrong: command 'echo "hello"'
right: command '/bin/echo "hello"'

要查找命令完整路径:

$ which echo

要验证 cron 是否按预期运行:

$ sudo grep CRON /var/log/syslog

grep 结果应该有类似这样的行:

Jan 1 12:00:00 example.com CRON[123]: (root) CMD (... your command here ...)

你在 Mac 上吗?

如果您没有在 syslog 中看到输出,而您使用的是 Mac,则可能需要阅读有关 Mac OSXcronlaunchd.

请参阅 cron plist (/System/Library/LaunchDaemons/com.vix.cron.plist) 并使用 stdout/stderr 路径来调试 cron 本身。我不记得launchctl卸载和launchctl加载plist是否足够,或者如果你必须完全重新启动它是一个系统守护进程。(查看lion 中的 cron 日志文件在哪里

如何相对于 Rails 进行日志记录?

要将日志相对于 Rails 应用程序,请省略前导斜杠(通常称为 cron.log)

set :output, "log/cron.log"

要将日志放在特定的完全限定目录中:

set :output, '/abc/def/ghi/log/cron.log'

每当 wiki 有一些关于重定向输出的好例子:

https://github.com/javan/whenever/wiki/Output-redirection-aka-logging-your-cron-jobs

例子:

every 3.hours do
  runner "MyModel.some_process", :output => 'cron.log'     
  rake "my:rake:task", :output => {:error => 'error.log', :standard => 'cron.log'}
  command "/usr/bin/cmd"
end  
于 2013-01-30T21:27:02.640 回答