脚本通过cron表现不同

时间:2011-11-24 01:19:37

标签: bash crontab

编辑:已更新以反映一些答案

我的家用电脑上有这个脚本test.sh:

注意:$ USER = john

#!/bin/bash 
/usr/bin/scp -q john@mysite.com:/home/$USER/tmp/$USER /home/$USER/tmp/ > /dev/null 2>&1
error_code="$?"

if [ "$error_code" != "0" ]; then    #if file NOT present on mysite then:
        echo "File does not exist."
        exit
fi
echo "File exists."

现在,假设我在服务器mysite.com上创建文件,如下所示:

echo > tmp/$USER

现在,当我手动在桌面上运行上述脚本时,就像这样:

./test.sh

我得到的结果是“文件存在。”

但是如果我通过crontab运行它,我会得到结果“文件不存在” 我的crontab看起来像这样:

* * * * * /home/user/test.sh >> /home/user/test.log 2>&1

我花了一整天的时间来检查逻辑和一切......我似乎无法弄清楚为什么会这样。在此先感谢您的所有帮助:)

编辑:scp查看mysite.com:/home/$USER/tmp/ dir 我的桌面和服务器上的$ USER是相同的。所以我不认为这是相对问题。 如果我要

ssh $USER@mysite.com 

然后再做

ls tmp/

我会在那里看到文件。

此外,crontab条目位于我的crontab中,而不是其他用户或root用户的crontab。

@Jonathan:我已经设置了基于密钥的身份验证。无需密码!

@netcoder:在我的日志文件中,我看到“文件不存在”的重复行。

@sarnold:在我的scp专栏中,我放了john@mysite.com,只是为了确保当crond运行脚本时cron在mysite.com上使用john的帐户。仍然,结果相同。

2 个答案:

答案 0 :(得分:1)

我希望问题就在这里:mysite.com:tmp/$USER - tmp/是相对于当前工作目录的相对路径。当您的代码通过crond(8)执行时,您的cwd可能与手动执行时不同。

作为@netcoder points out in his comment,绝对路径是处理crontab(5)文件执行的脚本/程序的最佳方式。

答案 1 :(得分:1)

在cron下运行时,$USER环境变量未设置可能会出现问题。

您可以尝试在脚本中添加以下内容:

echo "User: $USER" > /tmp/crontest.log

获得cron后运行脚本看一下/tmp/crontest.log中的内容

如果没有设置任何内容,您可能想尝试这样的事情:Where can I set environment variables that crontab will use?