我有一个简单的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将使用的环境变量? "应该非常有用.