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

ohh*_*hho 8 ruby bash cron

我有一个简单的ruby脚本,hello.rb:

#!/usr/bin/env ruby
puts 'hello' 
Run Code Online (Sandbox Code Playgroud)

它在命令行运行正常:

# /usr/local/src/hello/hello.rb
hello
Run Code Online (Sandbox Code Playgroud)

但是,如果我把它放入cron:

* * * * * /usr/local/src/hello/hello.rb >> /usr/local/src/hello/hello.log 2>&1
Run Code Online (Sandbox Code Playgroud)

日志文件中有错误:

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

/usr/bin/env ruby 但是在命令行运行正常:

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

如何修复env错误cron

the*_*Man 18

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

你不说的cron是否正在运行为你的用户,或以root身份,但是,在这两种情况下,你可以测试一下,看看加入的另一cron项在什么环境是这样的:

* * * * * /usr/bin/env > /path/to/your/home/directory/env.txt
Run Code Online (Sandbox Code Playgroud)

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

而不是/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
Run Code Online (Sandbox Code Playgroud)

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

which ruby
Run Code Online (Sandbox Code Playgroud)

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

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

如果您使用的是Linux或Mac OS,请尝试man 5 crontab获取更多信息.此外," 我在哪里可以设置crontab将使用的环境变量? "应该非常有用.