gpt4 book ai didi

ruby-on-rails - 如何调试 cron 不执行给定脚本或其他脚本的问题?

转载 作者:太空宇宙 更新时间:2023-11-03 17:13:35 25 4
gpt4 key购买 nike

我有一个我想每天运行的 Rails 脚本。我知道有很多方法,cron 的 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 问题吗?是否有我可以设置或更改的安全上下文来解决此错误?

谢谢!

更新

感谢 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

最佳答案

默认情况下,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,因此任何错误消息也会被记录下来。

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

关于ruby-on-rails - 如何调试 cron 不执行给定脚本或其他脚本的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/607599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com