【发布时间】:2017-02-04 01:33:20
【问题描述】:
在我的 Rails 项目中,我正在使用when gem 来管理 cron 作业。其中有一个:
* * * * * /bin/bash -l -c 'cd /home/myhome/analytics && RAILS_ENV=development /bundle exec rake my_rake_job'
但由于错误/bin/bash: bundle: command not found 无法正常工作
当我将 env 从 cronjob 记录到文件中时,我可以看到我在 /etc/environment 中声明的两个环境变量(其他任何地方都没有),但 PATH 只是 PATH=/usr/bin:/bin 而不是PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games" 取自我的 /etc/environment 文件。
我的意思是短期的肮脏解决方案是将 ruby 二进制文件(ruby、rake、rails、bundle 等)符号链接到/usr/bin,但这不是一个很好的解决方案。为什么 cron 加载了一些变量而不是 PATH?
附:这是我的/etc/pam.d/cron 文件
# The PAM configuration file for the cron daemon
@include common-auth
# Read environment variables from pam_env's default files, /etc/environment
# and /etc/security/pam_env.conf.
session required pam_env.so
# In addition, read system locale information
session required pam_env.so envfile=/etc/default/locale
@include common-account
@include common-session-noninteractive
# Sets up user limits, please define limits for cron tasks
# through /etc/security/limits.conf
session required pam_limits.so
【问题讨论】:
-
cron不是以 root 用户身份运行的吗?你不能用* * * * * /bin/bash -l -c 'source /etc/environment && cd /home/myhome/analytics && RAILS_ENV=development /bundle exec rake my_rake_job'解决这个问题吗? -
这不太可行,因为该行是由只要 gem 自动生成的,我有几十个 cron 作业,所以在那里添加源意味着我必须为所有人以及当我通过任何时候添加另一个 cron 作业时,请继续这样做
-
好的,看起来很合理。您至少可以检查用于运行 cron 命令的当前用户 ID 吗?
-
它以我的用户身份运行,而不是 root
-
好的,解决方法是:在
cd /home/myhome/analytics中创建一个bundle脚本,该脚本正确设置路径并使用传递的参数调用真正的bundle命令。哈克但肯定会工作,而无需更改您的 cron 命令。
标签: ruby-on-rails ruby linux bash cron