2011-11-24 93 views
0

编辑:更新,以反映一些答案脚本通过cron不同的行为

我有这个剧本,我家的电脑上test.sh:

注:$ USER =约翰

#!/bin/bash 
/usr/bin/scp -q [email protected]:/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 

现在,当我运行上面的sc手动在我的桌面上撕下,如下所示:

./test.sh 

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

但是,如果我可以通过crontab运行它,我得到的结果“文件不存在” 我的crontab是这样的:

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

我花了一整天来检查逻辑和一切。 ..我似乎无法弄清楚为什么这样。感谢事先你的帮助:)

编辑:SCP看起来mysite.com:/home/$USER/tmp/ DIR 我的台式机和服务器上的$ USER是一样的。所以我不认为这是一个亲缘问题。 如果我

ssh [email protected] 

,然后做

ls tmp/ 

我去看看那里的文件。

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

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

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

@sarnold:在我的scp系列中,我已经把[email protected],只是为了确保在crond运行脚本时,cron在mysite.com上使用john的帐户。仍然是相同的结果。

+1

你试过'scp'(ie:'/ usr/bin/scp')或'/ tmp'的绝对路径吗?你用什么用户运行cron?什么是cron的工作目录? test.log中有什么? – netcoder

+0

和@ netcoder的问题的附件 - “/ dev/null”中有什么?既然它不会告诉你,我建议你在一个文件中捕获标准输出和标准错误,这样你就可以看到你需要的信息是否在那里。例如,'scp'如何知道使用哪个密码? –

回答

1

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

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

1

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

你可以尝试添加这样的事情你的脚本:

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

得到cron来运行该脚本后,看看是什么/tmp/crontest.log

如果什么都没有设置你可能想要尝试这样的事情:Where can I set environment variables that crontab will use?

相关问题