【问题标题】:#!/usr/bin/env ruby is not found in cron#!/usr/bin/env ruby​​ 在 cron 中找不到
【发布时间】:2013-04-04 11:05:30
【问题描述】:

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

【问题讨论】:

    标签: ruby bash cron


    【解决方案1】:

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

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

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

    如果您使用的是 Linux 或 Mac OS,请尝试man 5 crontab 了解更多信息。另外,“Where can I set environment variables that crontab will use?”应该很有用。

    【讨论】:

    • 您刚刚回答正确的问题。但是环境变量来自 crond,而不是您的用户配置文件。这就是重点。
    • 我最终使用了/usr/local/bin/ruby .../hello.rb
    【解决方案2】:

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

    【讨论】:

    • crond 可以为 root 或系统上的任何用户运行 crontabs。
    • 正确,但它没有以您的身份登录。所以变量不是你的,你继承它们。
    猜你喜欢
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2011-07-11
    • 2013-11-17
    • 2018-02-17
    • 2020-04-21
    • 2014-01-24
    相关资源
    最近更新 更多