【问题标题】:How to debug an issue of cron's not executing a given script -- or other?如何调试 cron 不执行给定脚本的问题 - 或其他?
【发布时间】:2010-10-11 02:12:43
【问题描述】:

我有一个希望每天运行的 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 点使用cron 运行。 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

【问题讨论】:

    标签: ruby-on-rails cron centos selinux


    【解决方案1】:

    默认情况下,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
    

    >> 将标准输出重定向到文件,2>&1 将标准错误重定向到标准输出,因此也会记录任何错误消息。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 多年来我一直在 debian 和 ubuntu (vixie cron) 上使用 /etc/cron.d 中的符号链接,没有任何问题。事实上,vixie cron 似乎没有这样的选项。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-02
        • 1970-01-01
        • 2018-02-13
        相关资源
        最近更新 更多