2009-03-03 27 views
4

我有一个Rails脚本,我想每天运行。我知道有很多方法,并且某些方法令人不悦,但似乎满足了我的需求。如何调试cron不执行给定脚本的问题 - 或其他?

但是,我的脚本没有按计划执行。

我的应用程序位于/data/myapp/current,脚本位于script/myscript.rb。我可以毫无问题手动运行它为root有:

/data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb 

当我这样做,特殊的日志文件(log/myscript.log)被记录到预期:

Tue Mar 03 13:16:00 -0500 2009 Starting to execute script... 
... 
Tue Mar 03 13:19:08 -0500 2009 Finished executing script in 188.075028 seconds 

我有它设置与运行cron每天早上4点。 root的crontab:

$ crontab -l 
0 4 * * * /data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb 

事实上,它看起来像今天早上试图运行!

$ tail -100 /var/log/cron 
... 
Mar 2 04:00:01 hostname crond[8894]: (root) CMD (/data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb) 
... 
Mar 3 04:00:01 hostname crond[22398]: (root) CMD (/data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb) 
... 

但是,我的日志文件中没有条目,应更新的数据没有更新。日志文件的权限(作为测试)甚至被设置为全局可写:

$ ls -lh 
total 19M 
... 
-rw-rw-rw- 1 myuser apps 7.4K Mar 3 13:19 myscript.log 
... 

我在CentOS运行5

所以我的问题是...

  1. 还能在哪里我寻找信息来调试这个?
  2. 这可能是SELinux问题吗?是否有可以设置或更改的安全上下文来解决此错误?

谢谢!

更新

谢谢你对保罗和卢克两者。它确实是一个环境问题,并且将stderr捕获到日志文件使我能够找到该错误。

$ cat cron.log 
/usr/bin/env: ruby: No such file or directory 

$ head /data/myapp/current/script/runner 
#!/usr/bin/env ruby 
require File.dirname(__FILE__) + '/../config/boot' 
require 'commands/runner' 

添加特定的Ruby可执行文件的命令做了伎俩:

$ crontab -l 
0 4 * * * /usr/local/bin/ruby /data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb >> /data/myapp/current/log/cron.log 2>&1 

回答

7

默认情况下,cron将其输出发送给运行它的用户。你可以看看那里。

重定向cron运行脚本的输出非常有用,这样您就可以在日志文件中查看结果,而不是在服务器上查看某些随机用户的本地邮件。

这里是你将如何输出和错误重定向到一个日志文件:

cd /home/deploy/your_app/current; script/runner -e production ./script/my_cron_job.rb >> /home/deploy/your_app/current/log/my_file.log 2>&1 

>> stdout重定向到一个文件中,并与2>&1 stderr重定向到标准输出,所以任何错误信息也会被记录下来。

完成此操作后,您将能够检查错误消息以查看实际情况。

1

,当有人发现他们的脚本将不定时任务运行时,它会在命令行中运行通常的问题是它依赖于交互式会话的一些环境,但cron无法获得。一些频繁的候选人是“PATH”环境,可能还有“HOME”。

-1

在Linux上,确保所有配置文件(/ etc/crontab,/etc/crond.{daily,hhly,etc}/*和/etc/cron.d/*)都只能写入root用户,不是符号链接,否则它们将不被考虑。

要允许非根和/或符号链接,请为crond守护程序指定-p选项。

+1

我一直在debian&ubuntu(vixie cron)/etc/cron.d中使用符号链接多年,没有任何问题。事实上,vixie cron似乎没有这样的选择。 – graywh 2012-09-24 15:09:10