cronjob没有正确执行脚本

在本地服务器(ubuntu)上,我安装了程序foodsoft,这是用ruby编写的 . 它也使用了bundler,mysql . foodsoft可以通过命令启动

RAILS_ENV=production bundle exec rails s -b 192.168.0.15

我也编写了一个sh脚本,如果它没有运行就启动foodsoft:

#!/bin/sh
export DISPLAY=:0
export LANG=de_DE.utf8
ip_adr=$(/bin/hostname -I)
if [ $(pidof ruby) ]
then
echo "online"
else
echo "offline"
cd /home/jondal/foodsoft
RAILS_ENV=production bundle exec rails s -b $ip_adr
fi

如果我在shell中运行脚本,一切正常 . 但是我的cronjob(在crontab中列出)并不完整地执行脚本 . 它生成以下txt文件:

offline
bundler: command not found: rails
Install missing gem executables with `bundle install`

如果我在shell中使用前缀env -i启动sh脚本,我会得到以下内容:

offline / usr / local / bin / bundle:23:in load':无法加载此类文件 - /usr/share/rubygems-integration/1.9.1/gems/bundler-1.3.5/bin/bundle(LoadError)来自/ usr / local / bin / bundle:23:in'

你有什么想法我能做什么吗?

回答(1)

3 years ago

这很难说,但是通过运行 env -i 进行诊断可能会被biaised, env -i 可能会给你一个很好的 $PATH ,但是crontab中的 $PATH 更简约,引用 man 5 crontab

PATH设置为“/ usr / bin:/ bin” .

所以你可以把:

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

crontab 的顶部,因为 man 5 crontab 会在 EXAMPLE 部分中显示,然后重试 . 但这并没有解释如何使用简约PATH找到 bundle ,/ usr / bin中是 bundle

你在使用自己的 crontab 吗?如果是这样,唯一改变的是环境,如果PATH不够,我鼓励你通过在你的crontab中放一个_767099来比较你的env和crontab env,你可能会看到一些有趣的东西 .