如何在crontab中测试东西

时间:2009-08-12 12:29:32

标签: ruby bash unix scripting crontab

这一直在发生在我身上: 1)我写了一个脚本(ruby,shell等)。 2)运行它,它的工作原理。 3)把它放在crontab中让它在几分钟内运行,所以我知道它从那里运行。 4)它没有,没有错误跟踪,回到步骤2或3 1000次。

当我的ruby脚本在crontab中失败时,我真的不知道为什么它失败导致我输出这样的输出:

ruby script.rb >& /path/to/output

我得到了脚本的输出,但我没有得到它的任何错误,我没有得到来自bash的错误(如果找不到ruby或文件不存在)< / p>

我不知道设置了哪些环境变量以及它是否是一个问题。事实证明,要从crontab运行ruby脚本,您必须导出大量的环境变量。

我有没有办法让crontab运行一个脚本,好像我自己从终端运行

调试时,我必须重置计时器并返回等待状态。非常耗时。

如何更好地测试crontab中的内容或避免这些问题?

6 个答案:

答案 0 :(得分:7)

  

“我有没有办法让crontab运行一个脚本,就像我自己从终端运行它一样?”

是:

bash -li -c /path/to/script

从手册页:

[vindaloo:pgl]:~/p/test $ man bash | grep -A2 -m1 -- -i
   -i        If the -i option is present, the shell is interactive.
   -l        Make bash act as if it had been invoked as a login shell (see
             INVOCATION below).

答案 1 :(得分:6)

天儿真好,

cron的一个基本问题是你得到了一个由cron设置的最小环境。事实上,你只获得四个环境。 var的集合,它们是:

  • SHELL - 设置为/ bin / sh
  • LOGNAME - 设置为/ etc / passwd
  • 中的用户ID
  • HOME - 设置到您的家庭目录。在/ etc / passwd
  • 中找到
  • 路径 - 设置为“/ usr / bin:/ bin”

就是这样。

但是,您可以做的是拍摄所需环境的快照并将其保存到文件中。

现在让你的cronjob源代码一个简单的shell脚本来源这个环境。文件然后执行你的Ruby脚本。

BTW有一个包装源是一个共同的环境。 file是为多个cronjobs强制实施一致环境的绝佳方式。这也强制执行DRY原则,因为它只需要一个点来根据需要更新内容,而不必搜索一堆脚本并搜索特定的字符串,例如,如果更改了日志记录位置或现在使用了不同的实用程序被使用,例如gnutar而不是香草焦油。

实际上,这种技术非常成功地用于构建猴子,它用于实现几个主要世界航空公司共同的主要软件项目的持续集成。 3,500kSLOC每天检查和建造几次,每天运行一次超过8,000次回归测试。

HTH

“Avahappy,

答案 2 :(得分:3)

从ruby脚本内部运行'set'命令,从crontab中激活它,你就会看到确切的设置和不设置的内容。

答案 3 :(得分:2)

要找出cron运行作业的环境,请添加此cron作业:

{ echo "\nenv\n" && env|sort ; echo "\nset\n" && set; } | /usr/bin/mailx -s 'my env' you@example.com

或者将输出发送到文件而不是电子邮件。

答案 4 :(得分:1)

您可以编写一个包装脚本,例如rbcron,其外观类似于:

#!/bin/bash
RUBY=ruby
export VAR1=foo
export VAR2=bar
export VAR3=baz

$RUBY "$*" 2>&1

这会将标准错误从ruby重定向到标准输出。然后在你的cron作业中运行rbcron,标准输出包含out + err of ruby​​,还包含rbcron本身存在的“bash”错误。在您的cron条目中,重定向2>&1 > /path/to/output以获取输出+错误消息以转至/ path / to / output。

答案 5 :(得分:1)

如果你真的想以为自己运行,你可能想要从一个shell脚本中调用ruby,这个脚本来源.profile / .bashrc等。那就是'拉你的环境。

然而,缺点是它不会与您的环境隔离,如果您更改它,您可能会发现您的cron作业突然停止工作。