在cron中找不到#!/ usr / bin / env ruby

时间:2013-04-12 03:31:45

标签: ruby bash cron

我有一个简单的ruby脚本,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的env错误?

2 个答案:

答案 0 :(得分:18)

问题在于环境不是您所期望的。

您没有说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

或者,不要依赖{#1}}#!在那里定义你的Ruby。

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

如果您使用的是Linux或Mac OS,请尝试/usr/bin/env ruby以获取更多信息。此外,“Where can I set environment variables that crontab will use?”应该非常有用。

答案 1 :(得分:3)

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