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

#!/在cron中找不到usr/bin/env ruby,ruby,bash,cron,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: N

我有一个简单的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错误?

env仅在现有PATH变量中搜索。crond创建作为用户名运行的进程。因此路径是最小的。您必须在脚本本身中设置环境变量。问题是环境不是您所期望的

您不会说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操作系统,请尝试
man 5 crontab
了解更多信息。另外,“”应该非常有用。

crond可以为root用户或系统上的任何用户运行crontab。正确,但它不会以您的身份登录。所以这些变量不是你的,你继承了它们。你刚才正确回答了哪个问题。但是env变量来自crond,而不是您的用户配置文件。这就是重点。我最终使用了
/usr/local/bin/ruby…/hello.rb