10

我有一个简单的红宝石脚本hello.rb

#!/usr/bin/env ruby
puts 'hello' 

它在命令行运行正常:

# /usr/local/src/hello/hello.rb
hello

但是,如果我把它放在cron

* * * * * /usr/local/src/hello/hello.rb >> /usr/local/src/hello/hello.log 2>&1

日志文件中有错误:

/usr/bin/env: ruby: No such file or directory
/usr/bin/env: ruby: No such file or directory
...
/usr/bin/env: ruby: No such file or directory

/usr/bin/env ruby虽然在命令行运行正常:

# /usr/bin/env ruby -v
ruby 1.8.7 (2012-10-12 patchlevel 371) [i686-linux]

如何修复环境错误cron

4

2 回答 2

19

问题是环境不是你所期望的。

您没有说 cron 是以您的用户身份运行还是以 root 身份运行,但是,无论哪种情况,您都可以通过添加另一个 cron 条目来测试环境的样子:

* * * * * /usr/bin/env > /path/to/your/home/directory/env.txt

让它运行一次,然后将其拉出并查看文件。

与其使用/usr/bin/env尝试查找 Ruby 来运行您的代码,不如明确定义 Ruby:

* * * * * /path/to/the/ruby/you/want /usr/local/src/hello/hello.rb >> /usr/local/src/hello/hello.log 2>&1

您可以使用以下方法找出您想要的 Ruby:

which ruby

或者,而不是依赖/usr/bin/env于你的 #! 行,在那里定义你的 Ruby。

/usr/bin/env ruby当您使用 RVM 或 rbenv 之类的东西并在 Ruby 版本之间切换时,在您的代码中使用会很方便。当您将某些东西投入“生产”时,这不是一个好的选择,无论是在您自己帐户中的计算机上,还是在以 root 身份运行的生产主机上。

如果您使用的是 Linux 或 Mac OS,请尝试man 5 crontab了解更多信息。另外,“我在哪里可以设置 crontab 将使用的环境变量? ”应该非常有用。

于 2013-04-12T03:37:47.287 回答
3

env 仅在现有的 PATH 变量中搜索。crond 创建以您的用户名运行的进程。所以PATH是最小的。您必须在脚本本身中设置环境变量

于 2013-04-12T03:37:45.763 回答