编辑:已更新以反映一些答案
我的家用电脑上有这个脚本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的帐户。仍然,结果相同。答案 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?