如何在crontab中测试东西

ulv*_*ver 9 ruby unix bash scripting crontab

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

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

ruby script.rb >& /path/to/output
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

pgl*_*pgl 7

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

是:

bash -li -c /path/to/script
Run Code Online (Sandbox Code Playgroud)

从手册页:

[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).
Run Code Online (Sandbox Code Playgroud)


Rob*_*lls 6

天儿真好,

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

  • SHELL - 设置为/ bin/sh
  • LOGNAME - 设置为/ etc/passwd中的用户标识
  • 首页 - 设置为您的家庭目录.在/ etc/passwd中找到
  • 路径 - 设置为"/ usr/bin:/ bin"

而已.

但是,您可以执行的操作是获取所需环境的快照并将其保存到文件中.

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

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

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

HTH

"Avahappy,


max*_*llb 1

您可以编写一个包装脚本,名为 example rbcron,如下所示:

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

$RUBY "$*" 2>&1
Run Code Online (Sandbox Code Playgroud)

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