如何调试cron没有执行给定脚本的问题 - 或其他?

时间:2009-03-03 18:38:55

标签: ruby-on-rails cron centos selinux

我有一个我想每天运行的Rails脚本。我知道有很多方法,并且有些人不赞成使用cron'd script/runner方法,但它似乎满足了我的需求。

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

我的应用程序位于/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

我每天早上4点开始使用cronroot的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问题吗?是否有可以设置或更改的安全上下文可以解决此错误?
  3. 谢谢!

    更新

    感谢Paul和Luke。它确实是一个环境问题,并且将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
    

3 个答案:

答案 0 :(得分:7)

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

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

以下是将stdout和stderr重定向到日志文件的方法:

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重定向到stdout,以便记录任何错误消息。

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

答案 1 :(得分:1)

当有人发现他们的脚本不会在cron作业中运行时,从命令行运行的常见问题是它依赖于交互式会话所具有的某些环境,但cron没有得到。一些常见的候选人是“PATH”环境,可能是“HOME”。

答案 2 :(得分:-1)

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

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