我有一个cron作业设置为执行shell脚本,告诉服务器每小时过去2分钟运行一个ruby命令(jekyll build --source /path/to/source/dir --destination /path/to/dest/dir
)。当我通过终端运行脚本时脚本执行得很好,但是cron似乎没有触发它。我知道cron的环境与用户的环境不同,我已将其源路径设置为我的.bash_profile
,其中定义了用户ruby环境,根据其他地方的建议。我现在很茫然。
crontab条目如下所示:
2 * * * * . $HOME/.bash_profile ~/jek.sh
FWIW,.bash_profile
的相关部分,在安装RVM时自动设置(在共享主机上,有点过时的ruby也不会少,让Jekyll启动并运行而无法写入服务器自己的ruby目录意味着使用RVM;这似乎工作得非常好),是:
PATH=$PATH:$HOME/bin
export PATH
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*
我是否错误地调用了我的用户配置文件以便在cron环境中使用?我在语法中遗漏了一些明显的东西吗?任何帮助将不胜感激。
答案 0 :(得分:3)
您认为$HOME
会在cron的环境中评估什么?
由于您使用的是rvm
。 This是运行cron作业的正确方法
答案 1 :(得分:1)
你可能需要使用绝对路径,因为cron可能非常挑剔。
在'crontab -e'之后试试这个:
2 * * * * /bin/bash /home/username/jek.sh
如果您想将命令串在一起,请使用&&每个之间:
2 * * * * /bin/bash /home/user_name/.bash_profile && /bin/bash /home/username/jek.sh
作为注释,除了/ bin /之外,您还可以在/ usr / bin中找到许多命令。要查找命令的绝对位置,请使用“which”。例如,:
user@computer:~$ which bash
/bin/bash
最后,您可以使用cron直接运行ruby脚本,使用jekyll的绝对路径,并且可能在&&为了首先建立环境。
答案 2 :(得分:1)
在你的问题中,你正在运行的cron就像
2 * * * * . $HOME/.bash_profile ~/jek.sh
您需要使用此条目更正/验证多项内容
777
还是775
(rwx
)。如果没有,请使用chmod 777 ~/jek.sh
#!/usr/local/env sh
)&&
或;
分隔两个脚本,以便它们都能正常运行。目前,第二个脚本的名称将被视为第一个脚本的参数。.
部分之后有一个2 * * * *
。我不确定你为什么要添加它 - 它必须被删除。
如果@ psny的答案不适合您,请尝试在cron条目中导出路径变量。在那之后,整个事情应该正常工作。步骤
1)找到$PATH
echo $PATH #Lets call the string :some/path/:another/path
2)在crontab条目中手动设置路径
2 * * * * export PATH=:some/path/:another/path && /bin/bash /home/username/jek.sh