9

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

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

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

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

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

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

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

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

4

6 回答 6

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).
于 2009-08-12T15:24:43.367 回答
6

天,

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

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

而已。

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

现在让你的 cronjob 源成为一个简单的 shell 脚本来获取这个环境。文件,然后执行你的 Ruby 脚本。

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

实际上,这种技术非常成功地与 The Build Monkey 一起使用,它用于为世界几家主要航空公司通用的主要软件项目实施持续集成。每天检查和构建 3,500kSLOC 数次,每天运行一次超过 8,000 次回归测试。

高温高压

'很高兴,

于 2009-08-15T16:01:43.790 回答
3

从 ruby​​ 脚本内部运行一个“设置”命令,从 crontab 中触发它,你会确切地看到设置了什么,没有设置什么。

于 2009-08-12T12:59:11.373 回答
2

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

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

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

于 2009-08-12T16:08:47.507 回答
1

您可以编写一个名为 example 的包装脚本,rbcron它看起来像:

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

$RUBY "$*" 2>&1

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

于 2009-08-12T12:44:12.923 回答
1

If you really want to run it as yourself, you may want to invoke ruby from a shell script that sources your .profile/.bashrc etc. That way it'll pull in your environment.

However, the downside is that it's not isolated from your environment, and if you change that, you may find your cron jobs suddenly stop working.

于 2009-08-12T12:45:42.720 回答